ตำแหน่งของฐานข้อมูล sqlite บนอุปกรณ์


100

ฉันได้สร้างฐานข้อมูล SQLite โปรแกรมด้วยวิธีการเริ่มต้นของการขยายและการเอาชนะSQLiteOpenHelper onCreate()วิธีนี้จะสร้างฐานข้อมูลได้ทันทีเมื่อจำเป็น

ฉันต้องการตรวจสอบเนื้อหาของไฟล์ db บนเครื่อง OS X ด้วยเบราว์เซอร์ sqlite ฉันรู้ชื่อของไฟล์ db แต่ไม่พบในอุปกรณ์ ฉันเชื่อมต่อกับอุปกรณ์ผ่าน USB และดูด้วย Finder และ Terminal แต่ฉันไม่พบไฟล์ db

ตำแหน่งเริ่มต้นสำหรับฐานข้อมูล sqlite บนอุปกรณ์ Android คืออะไร?


คำตอบ:


96

คุณสามารถค้นหาฐานข้อมูลที่คุณสร้างขึ้นชื่อ <your-database-name>

ใน

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

ดึงออกมาโดยใช้ File explorer และเปลี่ยนชื่อเป็นนามสกุล. db3 เพื่อใช้ใน SQLiteExplorer

ใช้ File explorer ของ DDMS เพื่อไปยังไดเร็กทอรี emulator


1
เมื่อฉันลองใช้ในโปรแกรมจำลองฉันสามารถ cd to / data ได้ แต่เมื่อฉันลองใช้กับ Galaxy Vibrant ที่เชื่อมต่อฉันไม่สามารถ cd to / data ได้ เซิร์ฟเวอร์ adb ทำงานเป็นการใช้งานที่แตกต่างกันในสองกรณีนี้หรือไม่
Robᵩ

42
คุณไม่มีสิทธิ์เข้าถึงโฟลเดอร์ / data บนโทรศัพท์จริง มัน 700chmoded คุณต้องมีสิทธิ์รูทเพื่อดู
Falmarri

15
ในกรณีที่คุณต้องการรับเส้นทางจากแอปก็คือ context.getDatabasePath ("<your-database-name>") ซึ่งในความเป็นจริงกลับเส้นทางด้านบน คุณสามารถเข้าถึงเส้นทางนี้เพื่ออ่าน - เขียนได้ แต่จากแอปพลิเคชันที่สร้างฐานข้อมูลเท่านั้น
Yaroslav Mytkalyk

เส้นทางเริ่มต้นที่ Android บันทึกฐานข้อมูลจะไม่สามารถเข้าถึงได้บนอุปกรณ์ที่ไม่ได้รูท ดังนั้นวิธีที่ง่ายที่สุดในการเข้าถึงไฟล์ฐานข้อมูล (สำหรับสภาพแวดล้อมการดีบักเท่านั้น) คือการแก้ไขตัวสร้างของคลาส บางคำตอบหลังจากคำตอบนี้ (ตรงนี้: stackoverflow.com/a/21832714/2982814 ) คุณจะพบว่าฉันจัดการสิ่งนี้อย่างไร
RandomUser


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)
  {}
}

และในการดำเนินการนี้แอปของคุณต้องได้รับอนุญาตให้เข้าถึงการ์ด SD เพิ่มการตั้งค่าต่อไปนี้ใน manifest.xml ของคุณ

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

ไม่ใช่วิธีที่ยอดเยี่ยม แต่ใช้ได้ผล


ดี. ฉันกำลังมองหาสิ่งนี้ คุณสามารถเลือกที่จะอัปโหลดฐานข้อมูลทั้งหมดไปยังเซิร์ฟเวอร์เพื่อทำการวิเคราะห์ด้วยวิธีนี้
Jeroen

3
หากไม่ได้ผล ... ให้ใช้ชื่อฐานข้อมูล "/data/data/your.app.package/databases/your_db" เพียงแค่ลบส่วนขยาย ".db3"
Nigel Crasto

1
โซลูชันนี้ใช้งานได้ดี แต่คุณสามารถใช้ getDatabasePath (your_db_name) เพื่อรับไฟล์อ็อบเจ็กต์และใช้ getAbsolutePath () เพื่อรับพา ธ ที่ถูกต้องแทนที่จะสร้าง เมธอด getDatabasePath ถูกกำหนดไว้ใน ContextWrapper
รอย

ชื่อไฟล์และเส้นทางเป็นตัวพิมพ์เล็กและใหญ่ใน Android
AndroidDev

31

บริบทประกอบด้วยฟังก์ชันพา ธ มากมาย: Context.getXXXPath ()
หนึ่งในนั้นคือ android.content.Context.getDatabasePath (String dbname) ที่ส่งคืนพา ธ สัมบูรณ์ของฐานข้อมูลที่เรียกว่า 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

โปรดสังเกตว่าเส้นทางนี้สร้างขึ้นโดยอัตโนมัติหากใช้ SQLiteOpenHelper เพื่อเปิด DB


25

หากคุณกำลังพูดถึงอุปกรณ์จริงไม่/data/data/<application-package-name>สามารถเข้าถึงได้ คุณต้องมีสิทธิ์รูท ...


นั่นไม่เป็นความจริงอย่างแน่นอน ไม่สามารถเรียกดูได้แต่การเข้าถึงไฟล์ภายในขึ้นอยู่กับบิตการอนุญาตของแต่ละบุคคล
Chris Stratton

โทรศัพท์ของฉันรูทแล้ว ฉันจะ "เรียกดู" โฟลเดอร์ข้อมูลได้อย่างไร?
Sreecharan Desabattula

@SreecharanDesabattula คุณต้องไปที่ adb shell และเปลี่ยนเป็น superuser โดยใช้คำสั่ง "su" เพื่อเรียกดูไดเร็กทอรี
Gautham C.

/ system / bin / sh: su: not found
Sunnyday

@Sunnyday Trysudo su
Mohammedsalim Shivani

19

คำถามนี้เป็นคำถามเก่า แต่การตอบอาจช่วยคนอื่นได้

เส้นทางเริ่มต้นที่ Android บันทึกฐานข้อมูลจะไม่สามารถเข้าถึงได้บนอุปกรณ์ที่ไม่ได้รูท ดังนั้นวิธีที่ง่ายที่สุดในการเข้าถึงไฟล์ฐานข้อมูล (สำหรับสภาพแวดล้อมการดีบักเท่านั้น) คือการแก้ไขตัวสร้างของคลาส:

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

2
ฉันขอโทษ. คำตอบนี้มีอายุสี่ปี และ OP นั้นเก่ากว่านั้น (2010) ในเวลานี้ Android แตกต่างจากปี 2010 อย่างมากดังนั้นตำแหน่งฐานข้อมูลจึงอยู่ในเส้นทางอื่นได้ ฉันขอโทษที่ไม่สามารถช่วยเหลือคุณได้มากกว่านี้
RandomUser

อาจเกิดข้อผิดพลาดเนื่องจากแอปไม่ได้รับอนุญาตให้เขียนขอบคุณ
underfilho


9

ฐานข้อมูล SQLite เป็นเพียงไฟล์ คุณสามารถนำไฟล์นั้นย้ายไปมาและแม้แต่คัดลอกไปยังระบบอื่น (เช่นจากโทรศัพท์ของคุณไปยังเวิร์กสเตชันของคุณ) และมันจะทำงานได้ดี Android เก็บไฟล์ไว้ใน/data/data/packagename/databases/ไดเร็กทอรี คุณสามารถใช้adb commandหรือFile Explorer viewใน Eclipse ( Window > Show View > Other... > Android > File Explorer) เพื่อดูย้ายหรือลบได้


9

อาจจะสายไปหน่อย แต่มันจะช่วยได้ คุณสามารถเข้าถึงฐานข้อมูลได้โดยไม่ต้องรูทอุปกรณ์ของคุณผ่าน adb

เริ่ม adb โดยใช้ cmd และพิมพ์คำสั่งต่อไปนี้

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

ตอนนี้คุณสามารถเปิดได้จากที่นี่เป็นต้นไป


4
ใช่สำหรับ APK ดีบัก ไม่ได้สำหรับเวอร์ชันที่ใช้งานจริง (หรือใน Android รุ่นที่ใช้งานไม่ได้)
Chris Stratton

5

หากคุณตั้งชื่อฐานข้อมูลของคุณเป็นไฟล์โดยไม่ระบุเส้นทางวิธีทั่วไปในการรับโฟลเดอร์จะเป็นดังนี้:

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

ที่DBAdapter.DATABASE_NAMEเป็นเพียงStringเช่น "mydatabase.db"
Context.getFilesDir()ส่งคืนเส้นทางสำหรับไฟล์ของแอปเช่น/data/data/<your.app.packagename>/files/นั่นคือเหตุผลที่คุณต้อง.getParent()+"/databases/"ลบ "ไฟล์" และเพิ่ม "ฐานข้อมูล" แทน
BTW Eclipse จะเตือนคุณเกี่ยวกับสตริง "data / data /" แบบฮาร์ดโค้ด แต่ไม่ใช่ในกรณีนี้


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

คุณสามารถเข้าถึงได้โดยใช้ adb shell how-to

เนื้อหาจากลิงค์ด้านบน:

บทช่วยสอน: วิธีเข้าถึงฐานข้อมูล Android โดยใช้บรรทัดคำสั่ง เมื่อคุณเริ่มจัดการกับฐานข้อมูลในโปรแกรมของคุณเป็นสิ่งสำคัญและมีประโยชน์มากที่จะสามารถเข้าถึงได้โดยตรงนอกโปรแกรมของคุณเพื่อตรวจสอบสิ่งที่โปรแกรมเพิ่งทำไปและเพื่อแก้จุดบกพร่อง

และเป็นสิ่งสำคัญสำหรับ Android

นี่คือวิธีการ:

1) เปิดโปรแกรมจำลอง (หรือเชื่อมต่ออุปกรณ์จริงของคุณกับพีซีของคุณ) ฉันมักจะเปิดโปรแกรมของฉันจาก Eclipse สำหรับสิ่งนี้ 2) เรียกใช้พรอมต์คำสั่งในไดเรกทอรีเครื่องมือ Android 3) พิมพ์ adb shell สิ่งนี้จะเปิดเปลือก Unix บนโปรแกรมจำลอง / อุปกรณ์ที่เชื่อมต่อของคุณ 4) ไปที่ไดเร็กทอรีที่ฐานข้อมูลของคุณอยู่: ข้อมูล cd / data ที่นี่คุณมีรายชื่อแอปพลิเคชันทั้งหมดบนอุปกรณ์ของคุณไปที่ไดเรกทอรีแอปพลิเคชันของคุณ (ระวัง Unix เป็นกรณีที่สำคัญ !!) cd com.alocaly.LetterGame และลงมา ในไดเร็กทอรีฐานข้อมูลของคุณ: ฐานข้อมูล cd ที่นี่คุณจะพบฐานข้อมูลทั้งหมดของคุณ ในกรณีของฉันมีเพียงรายการเดียว (ตอนนี้): SCORE_DB 5) เปิด sqlite บนฐานข้อมูลที่คุณต้องการตรวจสอบ / เปลี่ยนแปลง: sqlite3 SCORE_DB จากที่นี่คุณสามารถตรวจสอบว่ามีตารางใดบ้าง: .tables 6) ป้อนคำสั่ง SQL ที่คุณต้องการ : เลือก * จากคะแนน;

มันค่อนข้างง่าย แต่ทุกครั้งที่ฉันต้องการฉันไม่รู้ว่าจะหาได้ที่ไหน


1

หากแอปพลิเคชันของคุณสร้างฐานข้อมูลฐานข้อมูลนี้จะถูกบันทึกไว้ในไดเร็กทอรีโดยค่าเริ่มต้น DATA/data/APP_NAME/databases/FILENAME.

ส่วนต่างๆของไดเร็กทอรีด้านบนสร้างขึ้นตามกฎต่อไปนี้ DATA เป็นเส้นทางที่วิธี Environment.getDataDirectory () ส่งกลับ APP_NAME คือชื่อแอปพลิเคชันของคุณ FILENAME คือชื่อที่คุณระบุในรหัสแอปพลิเคชันของคุณสำหรับฐานข้อมูล


0

คุณยังสามารถตรวจสอบว่า IDE ของคุณมียูทิลิตี้เช่นมุมมอง DDMS ของ Eclipse ซึ่งอนุญาตให้คุณเรียกดูไดเร็กทอรีและ / หรือคัดลอกไฟล์ไปยังและจาก Emulator หรืออุปกรณ์ที่รูท


0

กำหนดชื่อฐานข้อมูลของคุณเช่น:

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

และคุณสามารถดูฐานข้อมูลของคุณได้ใน:

storage/sdcard0/yourdatabasename.db

0

คลาสสาธารณะ MySQLiteOpenHelper ขยาย SQLiteOpenHelper {MySQLiteOpenHelper (บริบทบริบท) {super (context, "/mnt/sdcard/database_name.db", null, 0); }}

อย่า hardcode "/ sdcard /"; ใช้ Environment.getExternalStorageDirectory (). getPath () แทน


0

ทำเส้นทางไม่ hardcode //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>)วิธีการแก้ปัญหาที่เป็นไปได้นี้คือการใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.