डिवाइस पर साइक्लाइट डेटाबेस का स्थान


100

मैंने एक sqlite डेटाबेस प्रोग्राम बनाया है जो कि डिफेंडिंग SQLiteOpenHelperऔर ओवरराइडिंग के डिफ़ॉल्ट तरीके के साथ है onCreate()। इस तरह जरूरत पड़ने पर मक्खी पर डीबी बन जाता है।

मैं अपने OS X मशीन पर db फ़ाइल की सामग्री की जाँच एक sqlite ब्राउज़र के साथ करना चाहता हूँ। मुझे db फ़ाइल का नाम पता है, लेकिन मैं इसे डिवाइस पर नहीं ढूँढ सकता। मैंने USB के माध्यम से डिवाइस से कनेक्ट किया है और खोजक और टर्मिनल के साथ देखा है, लेकिन मैं अभी db फ़ाइल नहीं ढूँढ सकता।

एंड्रॉइड डिवाइस पर एक sqlite डेटाबेस के लिए डिफ़ॉल्ट स्थान क्या है?


जवाबों:


96

आप अपने बनाए गए डेटाबेस को नाम दे सकते हैं <your-database-name>

में

//data/data/<Your-Application-Package-Name>/databases/<your-database-name>

फ़ाइल एक्सप्लोरर का उपयोग करके इसे बाहर निकालें और इसे SQLiteExplorer में उपयोग करने के लिए .db3 एक्सटेंशन का नाम बदलें

एमुलेटर निर्देशिका पर नेविगेट करने के लिए डीडीएमएस के फ़ाइल एक्सप्लोरर का उपयोग करें।


1
जब मैं एक एमुलेटर में कोशिश करता हूं, तो मैं सीडी / डाटा कर सकता हूं। लेकिन जब मैं अपने जुड़े हुए गैलेक्सी वाइब्रेंट के साथ कोशिश करता हूं, तो मैं / डेटा को सीडी नहीं कर सकता। क्या adb सर्वर उन दो मामलों में एक अलग उपयोग के रूप में चलता है?
राब

42
आपके पास वास्तविक फोन पर / डेटा फ़ोल्डर तक पहुंच नहीं है। यह चंबल है 700। इसे देखने के लिए आपको रूट विशेषाधिकारों की आवश्यकता है।
फाल्मरी

15
यदि आप ऐप से पथ प्राप्त करना चाहते हैं , तो यह संदर्भ में है। यहDatabasePath ("<आपका डेटाबेस-नाम>") है। जो वास्तव में ऊपर का रास्ता लौटाता है। आप इस पथ को पढ़ने-लिखने के लिए उपयोग कर सकते हैं, लेकिन केवल उस एप्लिकेशन से, जिसने डेटाबेस बनाया है।
यारोस्लाव मायटालिक

डिफ़ॉल्ट पथ जहां एंड्रॉइड बचाता है डेटाबेस को गैर-रूट किए गए डिवाइस पर accesed नहीं किया जा सकता है। इसलिए, डेटाबेस फ़ाइल (केवल डीबगिंग वातावरण के लिए) तक पहुंचने का सबसे आसान तरीका वर्ग के निर्माता को संशोधित करना है। इस के बाद कुछ जवाब (बिल्कुल यहाँ: stackoverflow.com/a/21832714/2982814 ), आप पाएंगे कि मैंने इसे कैसे प्रबंधित किया।
रैंडमयूज़र


45

इसके लिए मैंने जो किया वह किया है

File f=new File("/data/data/your.app.package/databases/your_db.db3");
FileInputStream fis=null;
FileOutputStream fos=null;

try
{
  fis=new FileInputStream(f);
  fos=new FileOutputStream("/mnt/sdcard/db_dump.db");
  while(true)
  {
    int i=fis.read();
    if(i!=-1)
    {fos.write(i);}
    else
    {break;}
  }
  fos.flush();
  Toast.makeText(this, "DB dump OK", Toast.LENGTH_LONG).show();
}
catch(Exception e)
{
  e.printStackTrace();
  Toast.makeText(this, "DB dump ERROR", Toast.LENGTH_LONG).show();
}
finally
{
  try
  {
    fos.close();
    fis.close();
  }
  catch(IOException ioe)
  {}
}

और ऐसा करने के लिए, आपके ऐप में एसडी कार्ड तक पहुंचने की अनुमति होनी चाहिए, अपने मेनिफ़ेस्ट के लिए निम्नलिखित सेटिंग जोड़ें। xml

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

शानदार तरीका नहीं है, लेकिन काम करता है।


अच्छा लगा। मुझे इसकी तलाश थी। कोई भी इस तरह से विश्लेषण के लिए एक सर्वर पर पूरा डीबी अपलोड करने का विकल्प चुन सकता है।
जेरोइन

3
अगर यह काम नहीं करता है ... डेटाबेस नाम "/data/data/your.app.package/dat डेटाबेस/your_db" बस एक्सटेंशन को हटा दें ".db3" का उपयोग करें
निगेल

1
यह समाधान ठीक काम करता है। लेकिन, आप फ़ाइल ऑब्जेक्ट प्राप्त करने के लिए getDatabasePath (your_db_name) का उपयोग कर सकते हैं और इसे बनाने के बजाय सटीक पथ प्राप्त करने के लिए getAbsolutePath () का उपयोग कर सकते हैं। GetDatabasePath विधि को ContextWrapper में परिभाषित किया गया है।
रॉय

Android में फ़ाइल और पथ नाम केस संवेदी हैं।
एंड्रॉइड डे

29

प्रसंग में कई पथ फ़ंक्शंस हैं: Context.getXXXPath ()
उनमें से एक android.content.Context.getDatabasePath (स्ट्रिंग dbname) है जो डेटाबेस नाम के डेटाबेस का पूर्ण पथ लौटाता है।

Context ctx = this; // for Activity, or Service. Otherwise simply get the context.
String dbname = "mydb.db";
Path dbpath = ctx.getDatabasePath(dbname);

इस मामले में, दिया गया रास्ता कुछ इस तरह होगा:

/data/data/com.me.myapp/databases/mydb.db

ध्यान दें कि DB को खोलने के लिए SQLiteOpenHelper का उपयोग करने पर यह मार्ग स्वतःपूर्ण हो जाता है।


25

यदि आप वास्तविक डिवाइस के बारे में बात कर रहे हैं तो /data/data/<application-package-name>यह अस्वीकार्य है। आपके पास मूल अधिकार होना चाहिए ...


यह बिल्कुल सच नहीं है। यह ब्राउज़ करने योग्य नहीं है , लेकिन फ़ाइलों की पहुंच उनकी व्यक्तिगत अनुमति बिट्स पर निर्भर करती है।
क्रिस स्ट्रैटन

मेरा फोन रूट हो गया है। मैं डेटा फ़ोल्डर को "ब्राउज़" कैसे कर सकता हूं?
श्रीचरण देसबत्तुला

@SreecharanDesabattula, आपको निर्देशिका को ब्राउज़ करने के लिए "su" कमांड का उपयोग करके adb शेल पर जाना होगा और सुपरयुसर पर स्विच करना होगा।
गौतम सी।

/ प्रणाली / बिन / श: सु: नहीं मिली
सनीडे

@ सन्नीडे ट्राईsudo su
शिवानी

19

यह पुराना सवाल है, लेकिन जवाब देने से दूसरों की मदद हो सकती है।

डिफ़ॉल्ट पथ जहां एंड्रॉइड बचाता है डेटाबेस को गैर-रूट किए गए डिवाइस पर accesed नहीं किया जा सकता है। इसलिए, डेटाबेस फ़ाइल (केवल डीबगिंग वातावरण के लिए) तक पहुंचने का सबसे आसान तरीका वर्ग के निर्माता को संशोधित करना है:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "/mnt/sdcard/database_name.db", null, 0);
    }
}

इन लाइनों के साथ उत्पादन वातावरण के लिए परिवर्तन याद रखें:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "database_name.db", null, 0);
    }
}

मैं इस कोशिश की और त्रुटि दी Failed to open database '/mnt/sdcard/itens'.मेंLogcat
underfilho

1
मुझे खेद है। यह उत्तर चार साल पुराना है। और ओपी उससे अधिक पुराना है (2010)। इस समय, एंड्रॉइड 2010 से काफी अलग है। इसलिए डेटाबेस स्थान किसी अन्य पथ में हो सकता है। मुझे खेद है कि मैं आपकी अधिक मदद नहीं कर सकता।
रैंडमयूजर

संभवत: त्रुटि हुई एप्लिकेशन वैसे भी लिखने की अनुमति दी क्योंकि था नहीं, धन्यवाद
underfilho


9

एक SQLite डेटाबेस सिर्फ एक फ़ाइल है। आप उस फ़ाइल को ले जा सकते हैं, उसे इधर-उधर कर सकते हैं, और यहां तक ​​कि उसे दूसरे सिस्टम पर भी कॉपी कर सकते हैं (उदाहरण के लिए, आपके फोन से आपके वर्कस्टेशन तक), और यह ठीक काम करेगा। Android /data/data/packagename/databases/निर्देशिका में फ़ाइल संग्रहीत करता है । आप इसे देखने, स्थानांतरित करने या हटाने के लिए ग्रहण ( ) में adb commandया का उपयोग कर सकते हैं ।File Explorer viewWindow > Show View > Other... > Android > File Explorer


9

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

cmd का उपयोग करके adb शुरू करें और निम्न कमांड टाइप करें

-run-as com.your.package  
-shell@android:/data/data/com.your.package $ ls  
cache  
databases  
lib  
shared_prefs  

अब आप यहाँ से खोल सकते हैं।


4
हाँ, एक डीबग APK के लिए। नहीं, एक निर्माण के लिए (या एंड्रॉइड रिलीज़ पर जहां रन-अस टूट गया है)।
क्रिस स्ट्रैटन

5

यदि आप अपने db को एक पथ के बिना फ़ाइल के रूप में नाम देते हैं तो उसका फ़ोल्डर प्राप्त करने का सबसे सामान्य तरीका है:

final File dbFile = new File(getFilesDir().getParent()+"/databases/"+DBAdapter.DATABASE_NAME);

जहां "mydatabase.db" DBAdapter.DATABASE_NAMEजैसा ही है String
Context.getFilesDir()एप्लिकेशन की फ़ाइलों के लिए पथ देता है: जैसे /data/data/<your.app.packagename>/files/कि आपको .getParent()+"/databases/""फ़ाइलों" को हटाने और इसके बजाय "डेटाबेस" जोड़ने की आवश्यकता है।
BTW ग्रहण आपको हार्डकोड "डेटा / डेटा /" स्ट्रिंग के बारे में चेतावनी देगा लेकिन इस मामले में नहीं।


3
By Default it stores to:    

String DATABASE_PATH = "/data/data/" + PACKAGE_NAME + "/databases/" + DATABASE_NAME;

Where:

String DATABASE_NAME = "your_dbname";
String PACKAGE_NAME = "com.example.your_app_name";

और जांचें कि आपका डेटाबेस डिवाइस स्टोरेज में स्टोर है या नहीं। यदि हां, तो आपको Manifest.xml में अनुमति का उपयोग करना होगा:

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

3

आप इसे एड - शेल का उपयोग करके देख सकते हैं कि कैसे-कैसे

उपरोक्त लिंक से सामग्री:

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

और यह एंड्रॉइड पर भी महत्वपूर्ण है।

यहाँ है कि कैसे करना है:

1) एमुलेटर लॉन्च करें (या अपने वास्तविक डिवाइस को अपने पीसी से कनेक्ट करें)। मैं आमतौर पर इसके लिए ग्रहण से अपना एक कार्यक्रम शुरू करता हूं। 2) Android उपकरण निर्देशिका में एक कमांड प्रॉम्प्ट लॉन्च करें। 3) adb शेल टाइप करें। यह आपके एमुलेटर / कनेक्टेड डिवाइस पर यूनिक्स शेल लॉन्च करेगा। 4) उस निर्देशिका पर जाएं जहां आपका डेटाबेस है: सीडी डेटा / डेटा यहां आपके डिवाइस पर सभी एप्लिकेशनों की सूची है आपकी एप्लिकेशन निर्देशिका में जाएं (सावधान रहें, यूनिक्स संवेदनशील है !!) cd com.alocaly.LetterGame और उतरें !! अपने डेटाबेस निर्देशिका में: सीडी डेटाबेस यहाँ आप अपने सभी डेटाबेस पा सकते हैं। मेरे मामले में, केवल एक (अब) है: SCORE_DB 5) आप जिस डेटाबेस को जाँचना / बदलना चाहते हैं, उस पर sqlite लॉन्च करें: sqlite3 SCORE_DB यहाँ से, आप जाँच कर सकते हैं कि कौन-सी तालिकाएँ मौजूद हैं: .tables 6 आप जिस भी SQL निर्देश को चाहते हैं, उसे दर्ज करें। : चयन * स्कोर से;

यह काफी सरल है, लेकिन हर बार जब मुझे इसकी आवश्यकता होती है, मुझे नहीं पता कि इसे कहां खोजना है।


1

यदि आपका एप्लिकेशन डेटाबेस बनाता है, तो यह डेटाबेस डिफ़ॉल्ट रूप से डायरेक्टरी में सेव होता है DATA/data/APP_NAME/databases/FILENAME.

उपरोक्त निर्देशिका के हिस्सों का निर्माण निम्नलिखित नियमों के आधार पर किया जाता है। DATA वह पथ है जो Environment.getDataDirectory () विधि देता है। APP_NAME आपका एप्लिकेशन नाम है। FILENAME वह नाम है जिसे आप डेटाबेस के लिए अपने एप्लिकेशन कोड में निर्दिष्ट करते हैं।


0

आप यह भी जांच सकते हैं कि आपकी आईडीई में ग्रहण की डीडीएमएस परिप्रेक्ष्य जैसी उपयोगिता है जो आपको एमुलेटर या रूट किए गए डिवाइस से निर्देशिका और / या फ़ाइलों को कॉपी करने की अनुमति देती है।


0

अपने डेटाबेस का नाम परिभाषित करें जैसे:

private static final String DATABASE_NAME = "/mnt/sdcard/hri_database.db";

और आप इसमें अपना डेटाबेस देख सकते हैं:

storage/sdcard0/yourdatabasename.db

0

सार्वजनिक वर्ग MySQLiteOpenHelper, SQLiteOpenHelper {MySQLiteOpenHelper (संदर्भ प्रसंग) {सुपर (संदर्भ, "/mnt/sdcard/database_name.db", null, 0) का विस्तार करता है; }}

हार्डकोड न करें "/ sdcard /"; इसके बजाय Environment.getExternalStorageDirectory ()। getPath () का उपयोग करें


0

मार्ग को हार्डकोड न करें //data/data/<Your-Application-Package-Name>/databases/<your-database-name>। वैसे यह ज्यादातर मामलों में काम करता है, लेकिन यह उन डिवाइसों में काम नहीं कर रहा है जहां डिवाइस कई उपयोगकर्ताओं का समर्थन कर सकता है। रास्ता जैसा हो सकता है //data/user/10/<Your-Application-Package-Name>/databases/<your-database-name>। संभव समाधान इसका उपयोग कर रहा है context.getDatabasePath(<your-database-name>)

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