डिवाइस पर sqlite डेटाबेस डिबगिंग


98

मैं वर्तमान में एंड्रॉइड के लिए एक वाईफाई एप्लिकेशन पर काम कर रहा हूं। मुझे डिवाइस पर डेटाबेस तक पहुंचने की कोशिश करने में परेशानी हो रही है। एमुलेटर में डिबगिंग मेरे लिए काम नहीं करता है, क्योंकि एमुलेटर में कोई वाईफाई सपोर्ट नहीं है। मैंने उपयोग करके डेटाबेस फ़ाइल को डिवाइस से बाहर खींचने की कोशिश की

adb pull data/data/package-name/databases/database-name

लेकिन मुझे त्रुटि "अनुमति से वंचित।" इस उत्तर में एंड्रॉइड: डेटाबेस फाइलें कहां संग्रहीत हैं? , कॉमन्सवेयर ने डिबग मोड में चलकर डेटाबेस फ़ाइल को खींचने का सुझाव दिया है। लेकिन यह भी काम नहीं करता है। डिवाइस को रूट किए बिना डेटाबेस को डीबग करने के तरीके पर कोई मदद बहुत सराहना की जाएगी।

जवाबों:


142

मैं दूसरे उत्तर से खुद को दोहराऊंगा :

एपीआई स्तर 8 (एंड्रॉइड 2.2) से शुरू होकर, यदि आप एप्लिकेशन को डिबग करने योग्य बनाते हैं, तो आप शेल run-asकमांड का उपयोग कमांड या निष्पादन योग्य को विशिष्ट उपयोगकर्ता / एप्लिकेशन के रूप में चलाने के लिए कर सकते हैं या UIDअपने एप्लिकेशन पर स्विच कर सकते हैं ताकि आप इसके डेटा तक पहुंच सकें निर्देशिका।

इसलिए यदि आप अपने एप्लिकेशन डेटाबेस को उस डिवाइस से खींचना चाहते हैं जिसे आपको एप्लिकेशन के डीबग बिल्ड को चलाना चाहिए, adb shellतो निम्न कमांड से कनेक्ट करें और चलाएं:

run-as com.yourpackage sh -c "cat ~/databases/db-file" > /sdcard/db-file.sqlite

यह db-fileआपके एसडी कार्ड / एक्सटर्नल स्टोरेज के रूट को कॉपी करेगा । अब आप इसे आसानी से फाइल मैनेजर, adb pullया जो कुछ भी आप चाहें का उपयोग करके वहां से प्राप्त कर सकते हैं । ध्यान दें कि इस दृष्टिकोण के साथ, आपके एप्लिकेशन को WRITE_EXTERNAL_STORAGEअनुमति की कोई आवश्यकता नहीं है , क्योंकि प्रतिलिपि शेल उपयोगकर्ता द्वारा की जाती है जो हमेशा बाहरी संग्रहण पर लिख सकते हैं।

लिनक्स / मैक सिस्टम पर आपके कंप्यूटर पर सीधे एक डेटाबेस को कॉपी करने की संभावना है, निम्नलिखित कमांड के साथ कोई भी उपयोग कर सकता है:

adb shell 'run-as com.yourpackage sh -c "cat ~/databases/db-file"' > db-file.sqlite

हालांकि यह CR / LF प्रतीकों के रूपांतरण के कारण विंडोज पर सही ढंग से काम नहीं करेगा। वहां पूर्व विधि का उपयोग करें।


1
@MikeIsrael यदि आप अपने ऐप में SQLCipher का उपयोग नहीं करते हैं तो क्या आप करते हैं? यदि नहीं, तो मोटे तौर पर जांचें कि क्या डेटाबेस को सही ढंग से डाउनलोड किया गया था एक दर्शक में DB फाइल खोलें (अधिमानतः एक हेक्स-दर्शक) और जांचें कि क्या यह SQLite format 3स्ट्रिंग से शुरू होता है । यह भी सुनिश्चित करें कि आपके पास एक सही sqliteसंस्करण है (यानी आप sqlite3 डेटाबेस को sqlite2 निष्पादन योग्य के साथ खोलने की कोशिश नहीं कर रहे हैं)। और आप अन्य SQLite क्लाइंट (उदाहरण के लिए SQLiteStudio ) भी आज़मा सकते हैं । आशा करता हूँ की ये काम करेगा।
आइडलोन

1
मैं एक लाइनर के साथ परेशान कर रहा हूँ। यह ठीक काम करता है अगर मैं एक शेल में कमांड चलाता हूं, लेकिन अगर मुझे एक लाइनर में रखा जाता है: सिस्टम को निर्दिष्ट पथ नहीं मिल सकता है।
रेवा टायलर

2
पैकेज <मेरा पैकेज> अज्ञात है ... किसी को भी पता है कि क्यों। मैंने डिबग बटन दबाकर स्टूडियो के माध्यम से स्थापित किया।
नाथन श्वरमन

4
एंड्रॉइड लॉलीपॉप पर मुझे मिल रहा हैpermission denied
मुहम्मद बाबर

1
मैंने प्रत्येक में दो तालिकाओं और एक दर्जन या इतनी पंक्तियों के साथ एक डेटाबेस खींचा, और प्रत्येक तालिका पर पूर्ण प्रश्नों का चयन किया। एक ने ठीक काम किया, दूसरे ने फ़ाइल में डेटा त्रुटि की सूचना दी। मेरा सबसे अच्छा अनुमान अभी Android और स्थानीय शेल के बीच एक एन्कोडिंग बेमेल है।
मेसन

23

मैं अपने मैक पर इस शेल स्क्रिप्ट का उपयोग करता हूं, जो डेटाबेस को सीधे मेरे होम फ़ोल्डर में कॉपी करता है। आसान एक क्लिक समाधान, बस पैकेज नाम बदलें (com.example.app) और डेटाबेस नाम (database.sqlite)

सरल स्क्रिप्ट

#!/bin/bash
adb -d shell 'run-as com.example.app cat /data/data/com.example.app/databases/database.sqlite > /sdcard/database.sqlite'
adb pull /sdcard/database.sqlite ~/

स्क्रिप्ट जो तर्क स्वीकार करती है [package_name] [डेटाबेस]

#!/bin/bash

REQUIRED_ARGS=2
ADB_PATH=/Users/Tadas/Library/sdk/platform-tools/adb
PULL_DIR="~/"

if [ $# -ne $REQUIRED_ARGS ]
    then
        echo ""
        echo "Usage:"
        echo "android_db_move.sh [package_name] [db_name]"
        echo "eg. android_db_move.sh lt.appcamp.impuls impuls.db"
        echo ""
    exit 1
fi;


echo""

cmd1="$ADB_PATH -d shell 'run-as $1 cat /data/data/$1/databases/$2 > /sdcard/$2' "
cmd2="$ADB_PATH pull /sdcard/$2 $PULL_DIR"

echo $cmd1
eval $cmd1
if [ $? -eq 0 ]
    then
    echo ".........OK"
fi;

echo $cmd2
eval $cmd2

if [ $? -eq 0 ]
    then
    echo ".........OK"
fi;

exit 0

पहला कमांड डेटाबेस की एक शून्य-बाइट प्रतिलिपि बना रहा था, इसलिए मैंने आपकी स्क्रिप्ट में कुछ समायोजन किए: gist.github.com/romulof/6af8a8919660f395f975
romulof

14

आपको Android ऐप डेटाबेस देखने और प्रबंधित करने का सबसे अच्छा तरीका इस लाइब्रेरी का उपयोग करना है https://github.com/sanathp/DatabaseManager_For_Android

इस लाइब्रेरी से आप अपने ऐप से ही अपने ऐप SQLite डेटाबेस को मैनेज कर सकते हैं। आप अपने ऐप डेटाबेस में तालिकाओं को देख सकते हैं, अपडेट कर सकते हैं, हटा सकते हैं, अपनी तालिकाओं में पंक्तियाँ डाल सकते हैं। अपने ऐप से सभी को देख सकते हैं।

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

इसने मेरी बहुत मदद की। यह आपकी भी मदद करता है।

आप 1 मिनट का डेमो यहां देख सकते हैं: http://youtu.be/P5vpaGoBlBY


11

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

उपकरण, मुझे सबसे हाल ही में खोजा गया (और सबसे अधिक एहसान) Android डीबग डेटाबेस है

आपको केवल इस निर्भरता को जोड़ने की आवश्यकता है:

debugImplementation 'com.amitshekhar.android:debug-db:1.0.3'

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

D/DebugDB: Open http://192.168.178.XXX:8080 in your browser

यह हर ब्राउज़र के साथ काम करता है और आप अपने डेटाबेस तालिकाओं और साझा प्राथमिकताओं का निरीक्षण कर सकते हैं।

यहां छवि विवरण दर्ज करें

यह डिफॉल्ट और जेनमोशन एमुलेटर के साथ भी काम करता है।


इससे पहले जो उपकरण मैंने इस्तेमाल किया वह स्टेथो है

नकारात्मक पक्ष: आपको थोड़ा सा कोड जोड़ने की आवश्यकता है और आप क्रोम ब्राउज़र से बंधे हैं।

फायदा: आपके पास नेटवर्क ट्रैफिक का निरीक्षण करने का विकल्प भी है।


5

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

इस पोस्ट को देखें: Android पर SDCard के लिए डेटाबेस बैकअप बनाना


5

अगर तुम्हे मिले

The system cannot find the path specified.

प्रयत्न

adb -d shell "run-as com.yourpackage cat /data/data/com.yourpackage/databases/dbname.sqlite > /sdcard/dbname.sqlite"

दोहरे उद्धरण पर ध्यान दें!


3

मैंने बस किया:

$ adb shell
shell@android:/ $ run-as myapp.package.name sh
shell@android:/data/data/myapp.package.name $

तब मैं एक sqlite डेटाबेस या जो कुछ भी करना चाहता हूं उसे सही अनुमतियों के साथ शेल से डिबग कर सकता हूं।


2

अगर कोई एप्लिकेशन के निजी फ़ाइल को कॉपी करने के लिए (गैर-रूट) adb शेल से रन-अस नामक प्रोग्राम का उपयोग करने के लिए एक एपीके डीबग करने योग्य है, तो एक तरीका है।


2

यहाँ कदम से कदम निर्देश है - ज्यादातर अन्य उत्तरों के संयोजन से लिया गया है। यह उन उपकरणों के साथ काम करता है जो अनलॉक नहीं होते हैं।

  1. अपने डिवाइस से कनेक्ट करें और एप्लिकेशन को डिबग मोड में लॉन्च करें।

  2. अपने sd कार्ड में अपने एप्लिकेशन फ़ोल्डर से डेटाबेस फ़ाइल की प्रतिलिपि बनाएँ: निष्पादित करें:

    ./adb -d शेल 'रन-अस। com.yourpackge.name cat /data/data/com.yourpackge.name/dat डेटाबेस/filename.sqlite> /sdcard/fatename.sqlite'

  3. डेटाबेस फ़ाइलों को अपनी मशीन पर खींचें: निष्पादित करें:

    ./adb पुल / sdcard / execute :/adb

  4. फ़ायरफ़ॉक्स SQLLite प्रबंधक स्थापित करें: https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/

  5. फ़ायरफ़ॉक्स SQLLite प्रबंधक खोलें और ऊपर चरण 3 से अपनी डेटाबेस फ़ाइल खोलें।

  6. का आनंद लें!


2

Android Studio 4.1 Android SQLite डेटाबेस को देखने / संपादित करने के लिए एक नई सुविधा जोड़ी गई।

यहां छवि विवरण दर्ज करें

डेटाबेस इंस्पेक्टर कैसे खोलें

एंड्रॉइड स्टूडियो में डेटाबेस इंस्पेक्टर खोलने के लिए, आपको View > Tool Windows > Database Inspectorमेनू बार से चयन करना होगा ।

इसके अलावा, आपको एप्लिकेशन को API स्तर 26 या उच्चतर चलाने वाले डिवाइस पर चलाने की आवश्यकता है।

इस उपकरण का उपयोग आप कर सकते हैं

  • अपने डेटाबेस को क्वेरी करें

  • अपने डेटाबेस को संशोधित और डीबग करें

यहां छवि विवरण दर्ज करें


2

नए एंड्रॉइड स्टूडियो 4.1 में नया डेटाबेस इंस्पेक्टर है

https://developer.android.com/studio/preview/features/images/database-inspector.gif

आप View > Tool Windows > Database Inspectorइसे खोलने के लिए मेनू बार से निम्न विकल्पों का चयन कर सकते हैं । अधिक विस्तृत निर्देश इस ब्लॉग में मिल सकते हैं ।

एक अन्य तरीका इसके लिए स्टेथो का उपयोग करना है। आप निर्भरता जोड़ते हैं और तब डिवाइस को प्लग इन होने पर डेटाबेस की जांच करने के लिए क्रोम देवटूल (क्रोम: // निरीक्षण) का उपयोग कर सकते हैं।


1

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

Adb को रूट के रूप में चलाने के लिए, उपयोग करें adb root

यह भी देखें: एडीबी का उपयोग करते समय मुझे डेटा फ़ोल्डर से वंचित क्यों किया जाता है?


मैंने यह कोशिश की थी। लेकिन यह मुझे "अदब को प्रोडक्शन बिल्ड में रूट के रूप में नहीं चला सकता है"
Primal Pappachan

आपको इसे डिबग मोड में चलाने की आवश्यकता होगी।
मालफिस्ट

इसे देखें: mydroidworld.com/forums/android-hacks/… यदि आप इसे फोन पर चला रहे हैं और एमुलेटर नहीं, तो आपको इसे रूट करना होगा।
मालफिस्ट

मैंने एप्लिकेशन को डिबग मोड में चलाया और उपरोक्त चरणों को भी आज़माया। यह काम नहीं करता है।
प्रिमपपचन

यह केवल एमुलेटर या रूट किए गए डिवाइस के लिए काम करता है।
slott

1

run-asएंड्रॉइड 4.4.2 पर मेरे लिए कोई भी एंड-कैट-टू-एसडीकार्ड समाधान काम नहीं करता था। मुझे यकीन नहीं है, लेकिन मुझे संदेह है कि यह run-asटूल नए sdcard_rऔर sdcard_rwअनुमतियों को सही ढंग से नहीं संभालने के कारण हो सकता है ।

मुझे पहले /filesअपने एप्लिकेशन के निजी आंतरिक संग्रहण में डेटाबेस फ़ाइल की प्रतिलिपि बनानी थी :

shell@hammerhead:/ $ run-as com.example.myapp   
shell@hammerhead:/data/data/com.example.myapp $ cp databases/mydb files/mydb

तब मैंने /sdcard/Android/data/com.example.myapp/filesजवलंद में नकल की (इसके लिए WRITE_EXTERNAL_STORAGEअनुमति की आवश्यकता होती है ):

public class MainActivity extends BaseActivity {

    @Override
     protected void onCreate(Bundle savedInstanceState) {
         ...

         if (isExternalStorageWritable()) {
             final FileInputStream input;
             try {
                 input = openFileInput("mydb");

                 File output = new File(getExternalFilesDir(null), "mydb");

                 copy(input, output);
             } catch (FileNotFoundException e) {
                 e.printStackTrace();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }

     public void copy(FileInputStream in, File dst) throws IOException {
         OutputStream out = new FileOutputStream(dst);

         // Transfer bytes from in to out
         byte[] buf = new byte[1024];
         int len;
         while ((len = in.read(buf)) > 0) {
             out.write(buf, 0, len);
         }
         in.close();
         out.close();
     }

     public boolean isExternalStorageWritable() {
         String state = Environment.getExternalStorageState();
         return Environment.MEDIA_MOUNTED.equals(state);
     }
 }

अंत में, मैंने फ़ाइल को अपने लैपटॉप में कॉपी किया:

$ adb pull /sdcard/Android/data/com.example.myapp/files/mydb

1
एक सरल उपाय है। यदि आप 777 अपनी साइक्लाइट फाइल को चोदते हैं, तो रन-आउट से बाहर निकलें, यह आपको नियमित usre के रूप में इसे / sdcard पर कॉपी कर देगा।
zedix

1

मेरे डिवाइस में sdcard नहीं था

इसलिए पहला उपाय मेरे काम नहीं आया।

यदि आप इसी तरह के मुद्दे की कोशिश कर रहे हैं,

  adb shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
  adb pull /data/data/package/databases/yourdb.sqlite

/sdcardजरूरी नहीं कि एसडी कार्ड ही हो। मेरे फोन पर यह आंतरिक भंडारण की ओर इशारा करता है जब कोई भौतिक एसडी कार्ड मौजूद नहीं होता है।
प्रियवोल्ट

0

इस ऐप को आज़माएं: SQLiteWeb ( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb )। यह आपके डेटाबेस को बिना बाहर निकाले दूरस्थ पहुँच प्रदान करता है।

भुगतान किए गए संस्करण में, इसमें निजी डेटाबेस (/ डेटा / डेटा / पैकेज-नाम ...) के लिए रूट एक्सेस है या SQLiteWeb (ऐप के अंदर निर्देश) का उपयोग करके कनेक्ट करने के लिए सामग्री प्रदाता को लागू करना है।

लेकिन अगर आप मुफ्त संस्करण के साथ रहना चाहते हैं, तो आप अपने डेटाबेस को बाहरी भंडारण में बना सकते हैं:

database = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()
        + "/" + DATABASE_NAME, null, DATABASE_VERSION);

0

OSX पर, ऑटोमेटर और sqllitebrowser ( https://github.com/sqlitebrowser/sqlitebrowser ) के साथ @Tadas उत्तर का उपयोग करते हुए :

  1. ऑटोमेटर खोलें और नया वर्कफ़्लो बनाएँ।

  2. "रन शैल स्क्रिप्ट" क्रिया जोड़ें।

  3. इसे चिपकाएँ:

    source ~ / .bash_profile adb shell 'run-as cat /data/data/your_app_uid/dat डेटाबेस/db.name> /tmp/db.name' adb pull /tmp -db.name ~ / open -a sqlitebrowser ~ / db। नाम

  4. sqlitebrowser पर डेटाबेस को रिफ्रेश करने के लिए रन क्लिक करें।


0
  1. एक टर्मिनल खोलें
  2. cd <ANDROID_SDK_PATH>(मेरे लिए विंडोज पर cd C:\Users\Willi\AppData\Local\Android\sdk)
  3. cd platform-tools
  4. adb shell (यह केवल तभी काम करता है जब केवल एक एमुलेटर चल रहा हो)
  5. cd data/data
  6. su (सुपर यूजर विशेषाधिकार प्राप्त करें)
  7. cd <PACKAGE_NAME>/databases
  8. sqlite3 <DB_NAME>
  9. एसक्यूएल स्टेटमेंट जारी करें ( महत्वपूर्ण: उन्हें समाप्त करें ;, अन्यथा स्टेटमेंट जारी नहीं किया गया है और यह इसके बजाय एक नई लाइन के लिए टूट जाता है।)

नोट: यदि आपको निर्देशिका सामग्री को सूचीबद्ध करने की आवश्यकता है तो ls(लिनक्स) या dir(विंडोज़) का उपयोग करें ।

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