Android - पुलिंग SQlite डेटाबेस एंड्रॉइड डिवाइस


99

मैंने हर जगह देखा है और मुझे ऐसा करने के लिए एक वास्तविक सटीक उत्तर या एक ट्यूटोरियल नहीं मिल सकता है कि कैसे, यदि यह संभव है।

क्या बिना रूट किए Android डिवाइस के डेटाबेस को किसी भी तरह से खींचना संभव है? मुझे बस अपने पीसी पर इसे इकट्ठा करने के लिए किसी भी तरह से उस डेटा को निकालने की आवश्यकता है, इसलिए मैं यह कैसे कर सकता हूं? क्या मुझे ऐप को या जिस भी तरीके के बारे में आप लोगों को पता है, उसे रीप्रोग्राम करना है, लेकिन डिवाइस को रूट किए बिना याद रखें। धन्यवाद


यहाँ काम करने योग्य समाधान है: stackoverflow.com/a/29257875/291427
kmalmur



जवाबों:


78

एडीबी पुल कमांड का उपयोग करने के लिए आप जो चाहते हैं उसे प्राप्त करने का एक सामान्य तरीका है।

एक और तरीका जो मैं ज्यादातर मामलों में पसंद करता हूं वह है डेटाबेस को एसडी कार्ड में कोड द्वारा कॉपी करना:

try {
    File sd = Environment.getExternalStorageDirectory();

    if (sd.canWrite()) {
        String currentDBPath = "/data/data/" + getPackageName() + "/databases/yourdatabasename";
        String backupDBPath = "backupname.db";
        File currentDB = new File(currentDBPath);
        File backupDB = new File(sd, backupDBPath);

        if (currentDB.exists()) {
            FileChannel src = new FileInputStream(currentDB).getChannel();
            FileChannel dst = new FileOutputStream(backupDB).getChannel();
            dst.transferFrom(src, 0, src.size());
            src.close();
            dst.close();
        }
    }
} catch (Exception e) {

}

एसडी पर अपने घोषणापत्र में लिखने की अनुमति सेट करना न भूलें, जैसे नीचे।

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

1
अच्छी तरह से मैं एक सैमसंग गैलेक्सी टैब पर इसका उपयोग करने वाला हूं, जिसमें एसडी कार्ड नहीं है तो मैं वहां कैसे कर सकता हूं?
डेएक्स

और, मुझे डबल // का उपयोग करना होगा?
DeX03

हां, ऐसा इसलिए है क्योंकि / विशेष स्ट्रिंग चार के रूप में है। // आपके "//" में परिणाम होगा /।
कार्लकर्ल्सॉम

4
डेटाबेस पथ बनाने के बजाय, SQLiteDatabase में एक getPathविधि है।
विल

शानदार जवाब। बहुत स्मार्ट, उपयोगी और सरल।
गुंडु बंदर

179

यदि आपका डिवाइस Android v4 या इसके बाद के संस्करण पर चल रहा है, तो आप कमांड का उपयोग करके रूट के बिना , डेटाबेस सहित ऐप डेटा को खींच सकते हैं adb backup, फिर बैकअप फ़ाइल को निकाल सकते हैं और sqlite डेटाबेस तक पहुंच सकते हैं।

निम्न कमांड के साथ यूएसबी केबल के माध्यम से अपने पीसी के लिए पहला बैकअप ऐप डेटा, एप्लिकेशन app.package.nameके वास्तविक पैकेज नाम के साथ बदलें ।

adb backup -f ~/data.ab -noapk app.package.name

यह आपको "अपने डिवाइस को अनलॉक करने और बैकअप ऑपरेशन की पुष्टि करने के लिए" संकेत देगा। बैकअप एन्क्रिप्शन के लिए पासवर्ड न दें , ताकि आप इसे बाद में निकाल सकें। अपने डिवाइस पर "बैक अप माय डेटा" बटन पर क्लिक करें। स्क्रीन उस पैकेज का नाम प्रदर्शित करेगी जिसका आप बैकअप ले रहे हैं, फिर सफल समापन पर खुद को बंद कर लें।

data.abआपके होम फोल्डर में परिणामी फाइल में एंड्रॉइड बैकअप फॉर्मेट में एप्लिकेशन डेटा होता है। इसे निकालने के लिए निम्नलिखित कमांड का उपयोग करें:

dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -

यदि उपरोक्त openssl:Error: 'zlib' is an invalid command.त्रुटि के साथ समाप्त हो गया है, तो नीचे की कोशिश करें।

dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -

परिणाम एक apps/app.package.name/फ़ोल्डर है जिसमें एप्लिकेशन डेटा होता है, जिसमें sqlite डेटाबेस शामिल है।

अधिक जानकारी के लिए आप मूल ब्लॉग पोस्ट की जांच कर सकते हैं ।


9
उन लोगों के लिए जो zlib के बिना संकलित नहीं हैं, python के साथ डेटा निकालने के लिए blog.shvetsov.com/2013/02/… पर उत्तर की जाँच करें।
इंध।

2
विंडोज उपयोगकर्ताओं के लिए जहां अनपैक कमांड अनुपलब्ध है, आप "एंड्रॉइड बैकअप एक्सट्रैक्टर" जावा एप्लिकेशन ( sourceforge.net/projects/adbextractor ) का उपयोग कर सकते हैं । .Ab फ़ाइल को अनपैक करने के लिए आदेशों के लिए forum.xda-developers.com/showthread.php?t=2011811 देखें ।
lalitm

7
अपने मैकबुक प्रो पर, मुझे वह संदेश मिलता है openssl:Error: 'zlib' is an invalid command., जिसके बारे में मैंने HOWEVER के साथ प्रतिक्रिया दी dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -, क्योंकि यह दिखाता 17+0 records in17+0 records out17 bytes transferred in 0.000064 secsहै कि फ़ोल्डर में कुछ भी होने का कोई सबूत नहीं है। चूंकि यह सिर्फ 17 बाइट्स है, इसलिए मुझे लगता है कि कमांड भी विफल रही। मुझे लगता है कि यह बुरा है कि मैं adb pullएक डिबग ऐप से डेटाबेस कैसे नहीं कर सकता हूँ !!
किसी

12
प्रो टिप: यह बैकअप सामान ऐप के प्रकट होने पर काम नहीं करेगाandroid:allowBackup="false"
कोई व्यक्ति

9
opensslमैक ओएस एक्स पर मेरा zlibया तो आदेश का समर्थन नहीं किया , इसलिए मैंने एक काढ़ा के साथ पुनः स्थापित किया brew reinstall openssl:। यह आपके सिस्टम के खुलने का स्थान नहीं लेगा। इसलिए मैंने वर्तमान सत्र के लिए केवल PATH कमांड को संशोधित किया: export PATH=/usr/local/opt/openssl/bin:$PATHजिसके बाद इस उत्तर से कमांड को सफलतापूर्वक निष्पादित कर सकता था।
एलेक्स एन।

69

गैर-निहित उपकरणों पर डिबग करने योग्य ऐप्स 1 के लिए , आप निम्न आदेश का उपयोग कर सकते हैं:

adb shell run-as package.name chmod 666 /data/data/package.name/databases/file
adb pull /data/data/package.name/databases/file

उदाहरण:

adb shell run-as com.app chmod 666 /data/data/com.app/databases/data.db
adb pull /data/data/com.app/databases/data.db

एनवायरमेंट वेरिएबल्स के लिए पाथ एडीबी सेट करें या एंड्रॉइड एसडीके फ़ोल्डर प्लेटफॉर्म-टूल्स पर सीडी कमांड का उपयोग करें।

उदाहरण:

cd /folder/android-sdk/platform-tools/

तो ऊपर कमांड का उपयोग करें


1 ध्यान दें कि प्ले स्टोर में अधिकांश एप्लिकेशन डिबग करने योग्य नहीं हैं क्योंकि इसे डिबेट में फ्लैग करने योग्य फ्लैग सेट करने की आवश्यकता होती है।


8
जब मैं package.nameऐप के पैकेज से बदल देता हूं , तो त्रुटि वापस आ जाती है:run-as: Package 'com.my.app' is unknown
कोई व्यक्ति

3
ऐसा लगता है कि यह सभी फोन के लिए काम नहीं करता है। Nexus 4 के लिए काम करता है, उदाहरण के लिए SGS4 के लिए काम नहीं करता है।
रोमन माइनोक जूल

2
Db फ़ाइल को कहाँ सहेजा गया है?
वोजत पेचेक

3
यह मेरे लिए काम करता था, लेकिन मैं अपने नेक्सस 7 पर काम करने के लिए इसे प्राप्त नहीं कर सकता हूं जो कि एंड्रॉइड 5 पर अपडेट किया गया है। क्या कोई पुष्टि कर सकता है कि यह एंड्रॉइड 5 पर काम करता है?
पेड़अवसरण

15
यहां एंड्रॉइड 5 (लॉलीपॉप) एडीबी शेल के लिए एक हैक है "रन-के रूप में [package_name] chmod -R 777 / data / data / [package_name] / डेटाबेस" adb शेल "mkdir -p / sbcard / tempDB" adb शेल "cp -r / data / data / [package_name] / डेटाबेस / / sdcard / tempDB /। " adb पुल sdcard / tempDB /। अदब शेल "rm -r / sdcard / tempDB / *"
रुबिन

55

अधिकांश उत्तर यहां वैसे ही अधिक जटिल हैं जैसे कि उन्हें होना चाहिए। अगर आप अपने फोन से अपने ऐप के डेटाबेस को अपने कंप्यूटर में कॉपी करना चाहते हैं तो आपको बस इस कमांड की जरूरत है:

adb -d shell "run-as your.package.name cat databases/database.name" > target.sqlite

उपरोक्त आदेश में आपको जो कुछ भरना है, वह आपके ऐप का पैकेज नाम है, जिसे डेटाबेस कहा जाता है और वैकल्पिक रूप से क्या / जहाँ आप डेटाबेस को कॉपी करना चाहते हैं।

कृपया ध्यान दें कि यह विशिष्ट कमांड केवल तभी काम करेगा जब आपके पास केवल एक उपकरण आपके कंप्यूटर से जुड़ा हो। -dपैरामीटर का मतलब है कि केवल जुड़े उपकरण लक्षित किया जाएगा। लेकिन अन्य पैरामीटर हैं जो आप इसके बजाय उपयोग कर सकते हैं:

  • -e केवल चल रहे एमुलेटर को लक्षित करेगा
  • -s <serialnumber> एक विशिष्ट सीरियल नंबर के साथ एक उपकरण को लक्षित करेगा।


मैं इस फ़ाइल को कैसे खोल सकता हूँ?
जेहाद

@ जेहाद: मुझे भी यही समस्या थी। मुझे यह रास्ता मिल गया और यह मेरे लिए काम करता है। अपने फोन पर SSHDroid स्थापित adb -d shell "run-as your.package.name cat databases/database_name.db > /mnt/sdcard/database_name.db" शुरू SSHDroidशुरू FileZilla और SFTP प्रोटोकॉल के माध्यम से अपने फोन से कनेक्ट। डिफ़ॉल्ट दूरस्थ निर्देशिका के रूप में सेट करें / mnt / sdcard।
ज़ोल्टन सूले

सबसे आसान जवाब जब आप अपने खुद के ऐप का डेटाबेस प्राप्त करना चाहते हैं। दो अतिरिक्त: 1) यदि आप अपने डेटाबेस के नाम के बारे में निश्चित नहीं हैं, तो आप डेटाबेस फोल्डर ( adb -d shell "run-as your.package.name ls databases") और २) में फ़ाइलों को सूचीबद्ध करने के लिए एक ls कमांड का उपयोग कर सकते हैं, जिसे आप डेटाबेस के साथ-साथ किसी अन्य संबद्ध फाइल को प्राप्त करना चाहते हैं, में मेरे मामले में -smh और -wal फाइलें निकालने का एकमात्र तरीका डेटाबेस को खोलने के लिए SQLite के लिए DB ब्राउज़र प्राप्त करना था
Ronan

36

एंड्रॉइड स्टूडियो 3.0 या बाद के संस्करण का उपयोग करके डेटाबेस को भी साझा करना संभव है (यदि साझा वरीयता, कैश निर्देशिका और अन्य) यदि एप्लिकेशन गैर-रूट किए गए डिवाइस पर डिबग मोड में चलता है।

एंड्रॉइड स्टूडियो का उपयोग करके डेटाबेस को खींचने के लिए इन चरणों का पालन करें।

  1. व्यू > टूल विंडोज > डिवाइस फाइल एक्सप्लोरर पर क्लिक करें
  2. विस्तार / डेटा / डेटा / [पैकेज-नाम] नोड्स।

एंड्रॉइड स्टूडियो 3.0 में चरणों का पालन किया गया


धन्यवाद। एक एमुलेटर से डाउनलोड की गई फ़ाइलें, जबकि उन्हें असम्बद्ध गैलेक्सी S4 से प्राप्त नहीं किया जा सकता है।
कूलमाइंड

क्या आप डेटाबेस को किसी भी ऐप या केवल अपने ऐप से खींच सकते हैं?
लाइव-लव

कोई भी ऐप लेकिन प्रीकॉन्डिशन ऐप डिबगेबल होना चाहिए।
शाहिदुल

6
 adb shell "run-as [package.name] chmod -R 777 /data/data/[package.name]/databases" 
 adb shell "mkdir -p /sdcard/tempDB" 
 adb shell "cp -r /data/data/[package.name]/databases/ /sdcard/tempDB/." 
 adb pull sdcard/tempDB/ . 
 adb shell "rm -r /sdcard/tempDB/*"

5

उबंटू के लिए (न केवल?):

सर्जिस जवाब देखें, लेकिन इसके बजाय खुलता है zlib-flate का उपयोग करें:

बिल्ली appbackup.ab | (dd bs = 24 count = 0 Skip = 1; cat) | zlib-flate -uncompress> appbackup.tar

अन्यथा Opensl शायद फेंक देंगे:

Opensl: त्रुटि: 'zlib' एक अमान्य कमांड है।

खुलता है क्योंकि Ubuntu में zlib समर्थन के साथ संकलित नहीं किया गया है


1

चूंकि, वास्तव में मेरे लिए कुछ भी काम नहीं करता है। मैं एक साथ संयुक्त अन्य उत्तरों के आधार पर एक छोटी सी खिड़कियां BATCH स्क्रिप्ट बनाता हूं। आशा है कि यह किसी की मदद करेगा। बस उपयोग: backupDatabase <PackageName> <ApplicationName> [TargetDirectory]। यह सर्गेई की बैकअप विधि और एंड्रॉइड बैकअप एक्सट्रैक्टर का उपयोग करता है

@echo off

if [%1]==[] goto usage
if [%2]==[] goto usage
if NOT [%4]==[] goto usage

@echo Processing: preparations
set PACKAGE=%1
set APPLICATION_NAME=%2
set TARGET_DIR=%cd%
IF NOT "%~3"=="" set TARGET_DIR=%3

set PATH_ADB="c:\Program Files (x86)\Android\android-studio\sdk\platform-tools"
set PATH_ABE="c:\Programs\android-backup-extractor-20140630-bin"
set PATH_7Z="c:\Program Files\7-Zip"

@echo Processing: backup
%PATH_ADB%\adb.exe backup -f %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab -noapk %PACKAGE%

@echo Processing: unpack
java -jar %PATH_ABE%\abe.jar unpack %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab.tar

@echo Processing: extract
cd %TARGET_DIR%\%APPLICATION_NAME%
%PATH_7Z%\7z.exe e %APPLICATION_NAME%.ab.tar "apps\%PACKAGE%\db\%APPLICATION_NAME%"

@echo Processing: cleaning
del %APPLICATION_NAME%.ab
del %APPLICATION_NAME%.ab.tar
goto :eof

:usage
@echo.Pull out SQLite database file from your android device.
@echo.Needs: - connected device
@echo.       - device enable backup.
@echo.       - application enable backup
@echo.       - application in debug mode
@echo.       - installed Android Backup Extractor 
@echo.       - installed command line TAR extractor (7z, ...)
@echo.Does NOT need: root device
@echo.
@echo.Uses: - ADB backup (set PATH_ADB)
@echo.      - Android Backup Extractor (http://sourceforge.net/projects/adbextractor/) (set PATH_ABE)
@echo.      - Extract TAR container, uses 7z (set PATH_7Z)
@echo.
@echo.Usage: backupDatabase ^<PackageName^> ^<ApplicationName^> [TargetDirectory]
@echo.Example: backupDatabase com.foo.example ExampleApp 
@echo Example: backupDatabase com.foo.example ExampleApp workspace\AndroidProjects\Example
exit /B 1

1

आप आसानी से अपने डिवाइस से sqlite फ़ाइल निकाल सकते हैं (मूल आवश्यक नहीं)

  1. एसडीके फोल्डर पर जाएं
  2. सीडी मंच-उपकरण
  3. अदब शुरू करो

    cd / sdk / platform-tools/adb शेल

    फिर टर्मिनल में निम्न कमांड टाइप करें

    ./adbd -d शेल "रन-अस। com -your_packagename cat /data/data/com.your_packagename/dat डेटाबेस/jokhanaNepal> /sdcard/jokhana.bqlite"

    जैसे।

    ./adb -d शेल "रन-अस। com.yuvii.app cat /data/data/com.yuvii.app/dat डेटाबेस/jokhanaNepal> /sdcard/jokhana.sqbite"


1

यदि आप इसे एंड्रॉइड 6 पर करने की कोशिश कर रहे हैं तो अनुमति का अनुरोध करें और इस प्रश्न के उत्तर के कोड का उपयोग करें

if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_RC); 
    return; 
} 

एक बार यह दी जाती है

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == STORAGE_PERMISSION_RC) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //permission granted  start reading or writing database
        } else { 
            Toast.makeText(this, "No permission to read external storage.", Toast.LENGTH_SHORT).show();
        } 
    } 
} 

1

वैकल्पिक रूप से आप मेरी लाइब्रेरी अल्ट्रा डीबगर का उपयोग कर सकते हैं । यह डेटाबेस को फ़ाइल के रूप में डाउनलोड करने या सीधे ब्राउज़र में मूल्यों को संपादित करने की अनुमति देता है। कोई जड़ की जरूरत है, उपयोग करने के लिए बहुत आसान है।


1

मैक पर (कोई रूट आवश्यक)

1. Go to platform-tools folder.
2) Run following command in terminal.

./adb -d shell "run-as your.package.name cat databases/database.sqlite" > database.sqlite

यह प्लेटफ़ॉर्म-टूल फ़ोल्डर में sqlite फ़ाइल की प्रतिलिपि बनाएगा।


यह केवल तभी काम करता है जब ऐप डिबगिंग के लिए संकलित हो।
डेविड बेरी

@ डेविडवीरी हां, यह डीबी खींच देगा यदि डिबगिंग के लिए संकलित किया गया है, तो आप किसी भी ऐप के डीबी को खींच सकते हैं। और यह ऐप का गंभीर सुरक्षा मुद्दा होगा। :)
योगेश सुथार

0
 > is it possible to pull in any way a database of an Android device without having to root it? 

हाँ अगर आपका एंड्रॉइड ऐप उस डेटाबेस की फ़ाइल कॉपी बनाता है जो हर किसी के लिए सुलभ है।

एंड्रॉइड ऐप्स के निजी डेटा की सुरक्षा करता है इसलिए यह अन्य ऐप्स द्वारा दिखाई / एक्सेस करने योग्य नहीं है। एक डेटाबेस निजी डेटा है। आपका ऐप निश्चित रूप से डेटाबेस-फ़ाइल को पढ़ सकता है इसलिए यह कुछ सार्वजनिक दृश्यमान फ़ाइल की फ़ाइल-कॉपी कर सकता है।


0

एक निहित डिवाइस पर आप कर सकते हैं:

// check that db is there
>adb shell
# ls /data/data/app.package.name/databases
db_name.sqlite // a custom named db
# exit
// pull it
>adb pull /data/app.package.name/databases/db_name.sqlite

मुझे 100% यकीन नहीं है, लेकिन मुझे लगता है कि पुल से पहले जरूरत है> सु और अनुमति दें
pavol.franek

0

लैम विन्ह द्वारा दिए गए उत्तर के आधार पर, यहाँ एक साधारण बैच फ़ाइल है जो मेरे लिए मेरे 1 जनरल नेक्सस 7 पर काम करती है। यह उपयोगकर्ता को पैकेज नाम और फिर डेटाबेस नाम (.sqlite एक्सटेंशन के बिना) दर्ज करने के लिए प्रेरित करती है और इसे डालती है। c: \ temp में। यह मानता है कि आपके पास पर्यावरण चर में Android sdk सेट है।

@echo off
cd c:\temp\

set /p UserInputPackage= Enter the package name: 
set /p UserInputDB= Enter the database name: 

@echo on
adb shell "run-as %UserInputPackage% chmod 666 /data/data/%UserInputPackage%/databases/%UserInputDB%.sqlite"
adb pull /data/data/%UserInputPackage%/databases/%UserInputDB%.sqlite
@echo off
pause

0

यदि आप एंड्रॉइड 4.0 या इसके बाद के संस्करण पर हैं, और आप एक मैक पर हैं , तो यहां एक रूबी स्क्रिप्ट है जो आपके ऐप की सामग्री को डेस्कटॉप पर बचाएगा। मुझे लगता है कि यह उबंटू में भी काम करेगा, हालांकि मैंने इसका परीक्षण नहीं किया।

puts "enter your package name"
package_name = gets.chomp
puts "press the 'Back up my data' button on your device"
`adb backup -f ~/Desktop/data.ab -noapk #{package_name}`
puts "press enter once once the 'Backup finished' toast has appeared"
gets.chomp
puts "extracting..."
`dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -`

to run -> माणिक your_ruby_file_name.rb

यह स्क्रिप्ट केवल "हैप्पी पाथ" है, इसलिए कृपया सुनिश्चित करें कि आपका डिवाइस जुड़ा हुआ है और उस प्रोफाइल को आपके प्रोफाइल में जोड़ दिया गया है।


0

मैं आंतरिक भंडारण / से पीसी डेटाबेस को "बचाने के लिए" और "पुनर्स्थापना" का पूरा समाधान देता हूं (एडीबी के साथ पीसी पर नहीं)।

मैंने डेटाबेस को पुनर्स्थापित करने के लिए दो तरीके एक और सेव के लिए किए हैं। मेनऐक्टिविटी में ऑनक्रीट () के अंत में इन विधियों का उपयोग करें (यदि आप सेवर करना चाहते हैं या डेटाबेस को पुनर्स्थापित करना चाहते हैं तो एक या दूसरा)।

डेटाबेस को आंतरिक संग्रहण में सहेजें:

void copyDatabase (){
        try {
            final String inFileName = "/data/data/<pakage.name>/databases/database.db";
            final String outFileName = Environment.getExternalStorageDirectory() + "database_backup.db";
            File dbFile = new File(inFileName);
            FileInputStream fis = new FileInputStream(dbFile);


            Log.d(TAG, "copyDatabase: outFile = " + outFileName);

            // Open the empty db as the output stream
            OutputStream output = new FileOutputStream(outFileName);

            // Transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
            int length;
            while ((length = fis.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }

            // Close the streams
            output.flush();
            output.close();
            fis.close();
        }catch (Exception e){
            Log.d(TAG, "copyDatabase: backup error");
        }
    }

डेटाबेस को आंतरिक संग्रहण से पुनर्स्थापित करें:

void restoreDatabase (){
        try {
            final String inFileName = Environment.getExternalStorageDirectory() + "database_backup.db";
            final String outFileName = "/data/data/<package.name>/databases/database.db";
            File dbFile = new File(inFileName);
            FileInputStream fis = new FileInputStream(dbFile);

            Log.d(TAG, "copyDatabase: outFile = " + outFileName);

            // Open the empty db as the output stream
            OutputStream output = new FileOutputStream(outFileName);

            // Transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
            int length;
            while ((length = fis.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }

            // Close the streams
            output.flush();
            output.close();
            fis.close();
        }catch (Exception e){
            Log.d(TAG, "copyDatabase: backup error");
        }
    }

0

यह हमेशा बेहतर होता है अगर चीजें स्वचालित होती हैं। मैंने एडीबी का उपयोग करके डिवाइस से डीबी फ़ाइल की प्रतिलिपि बनाने के लिए सरल पायथन स्क्रिप्ट क्यों लिखी है । यदि आप इसे अक्सर कर रहे हैं तो यह बहुत सारे विकास समय बचाता है।

यदि डिवाइस रूट नहीं है, तो केवल डिबग करने योग्य एप्लिकेशन के साथ काम करता है।

यहाँ जिस्ट से लिंक है।

इसे इस रूप में चलाएं: python copyandroiddbfile.py

import sys
import subprocess
import re

#/
# Created by @nieldeokar on 25/05/2018.
#/

# 1. Python script which will copy database file of debuggable apps from the android device to your computer using ADB.
# 2. This script ask for PackageName and DatabaseName at runtime.
# 3. You can make it static by passing -d at as command line argument while running script and setting defaults in following way.
# 4. Edit script and change the values of varialbe packageName and dbName to debuggable app package name and database name then
# run script as : python Copydbfileandroid.py -d 

useDefaults = False


def checkIfPackageInstalled(strSelectedDevice) :

    packageName = 'com.nileshdeokar.healthapp.debug'
    dbName = 'healthapp.db'


    if not useDefaults : 
        print('Please enter package name : ')
        packageName = raw_input()

    packageString = 'package:'+packageName

    try:
        adbCheckIfPackageInstalledOutput = subprocess.check_output('adb -s ' + strSelectedDevice + ' shell pm list packages | grep -x '+ packageString, shell=True)
    except subprocess.CalledProcessError as e:
                print "Package not found"
                return


    if packageString.strip() == adbCheckIfPackageInstalledOutput.strip() : 
        if not useDefaults : 
            print('Please enter db name : ')
            dbName = raw_input()

        adbCopyDbString = 'adb -s '+strSelectedDevice + ' -d shell \"run-as '+packageName+' cat /data/data/'+packageName+'/databases/'+ dbName +'\" > '+dbName

        try:
            copyDbOp = subprocess.check_output(adbCopyDbString,shell=True)
        except subprocess.CalledProcessError as e:
                return

        if "is not debuggable" in copyDbOp :
            print packageString + 'is nto debuggable'

        if copyDbOp.strip() == "":
            print 'Successfully copied '+dbName + ' in current directory'

    else :
        print 'Package is not installed on the device'



defaultString = "-d"
if len(sys.argv[1:]) > 0 and sys.argv[1] == defaultString :
        useDefaults = True

listDevicesOutput = subprocess.check_output("adb devices", shell=True)
listDevicesOutput = listDevicesOutput.replace("List of devices attached"," ").replace("\n","").replace("\t","").replace("\n\n","")

numberofDevices = len(re.findall(r'device+', listDevicesOutput))

connectedDevicesArray = listDevicesOutput.split("device")   
del connectedDevicesArray[-1] 


strSelectedDevice = ''
if(numberofDevices > 1) :
    print('Please select the device : \n'),

    for idx, device in enumerate(connectedDevicesArray):
        print idx+1,device

    selectedDevice = raw_input()

    if selectedDevice.isdigit() :
        intSelected = int(selectedDevice)
        if 1 <= intSelected <= len(connectedDevicesArray) :
            print 'Selected device is : ',connectedDevicesArray[intSelected-1]
            checkIfPackageInstalled(connectedDevicesArray[intSelected-1])
        else :
            print 'Please select in range'
    else : 
        print 'Not valid input'

elif numberofDevices == 1 :
    checkIfPackageInstalled(connectedDevicesArray[0])
elif numberofDevices == 0 :
    print("No device is attached")

-1

यदि आप अपनी डेटाबेस फ़ाइल चाहते हैं

DDMS> फ़ाइल एक्सप्लोर देखें

अपने db फ़ाइल को अपने पैकेज के नाम से खोजें

तब डिवाइस से एक फ़ाइल खींचने पर क्लिक करें (केवल रूट किए गए डिवाइस)


3
यह किया जा सकता है लेकिन एक निहित डिवाइस पर, जो कि मेरे सवाल का बिंदु है, इसे रूट किए गए डिवाइस पर कैसे करना है
DeX03

1
यह एक गैर निहित डिवाइस पर काम नहीं करता है। आपका उत्तर यह बताना चाहिए कि
tony9099
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.