Vị trí của cơ sở dữ liệu sqlite trên thiết bị


100

Tôi đã tạo một cơ sở dữ liệu sqlite theo lập trình với cách mở rộng SQLiteOpenHelpervà ghi đè mặc định onCreate(). Bằng cách này, db được tạo nhanh chóng khi cần thiết.

Tôi muốn kiểm tra nội dung của tệp db trên máy OS X của mình bằng trình duyệt sqlite. Tôi biết tên của tệp db, nhưng tôi không thể tìm thấy nó trên thiết bị. Tôi đã kết nối với thiết bị qua USB và tìm kiếm bằng công cụ tìm và thiết bị đầu cuối, nhưng tôi không thể tìm thấy tệp db.

Vị trí mặc định cho cơ sở dữ liệu sqlite trên thiết bị Android là gì?


Câu trả lời:


96

Bạn có thể tìm thấy cơ sở dữ liệu đã tạo của mình, có tên <your-database-name>

trong

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

Kéo nó ra bằng cách sử dụng File explorer và đổi tên nó thành phần mở rộng .db3 để sử dụng nó trong SQLiteExplorer

Sử dụng Trình khám phá tệp của DDMS để điều hướng đến thư mục trình giả lập.


1
Khi tôi thử điều đó trong trình giả lập, tôi có thể cd sang / data. Nhưng khi tôi thử điều đó với Galaxy Vibrant đã kết nối của mình, tôi không thể cd sang / data. Máy chủ adb có chạy như một mục đích sử dụng khác nhau trong hai trường hợp đó không?
Robᵩ

42
Bạn không có quyền truy cập vào thư mục / data trên điện thoại thực. Nó đã chmoded 700. Bạn cần có đặc quyền root để xem nó.
Falmarri

15
Chỉ trong trường hợp nếu bạn muốn lấy đường dẫn từ ứng dụng , đó là context.getDatabasePath ("<your-database-name>"). Mà trên thực tế trả về đường dẫn ở trên. Bạn có thể truy cập đường dẫn này để đọc-ghi nhưng chỉ từ ứng dụng đã tạo cơ sở dữ liệu.
Yaroslav Mytkalyk

Không thể tích lũy đường dẫn mặc định nơi Android lưu cơ sở dữ liệu trên các thiết bị không root. Vì vậy, cách dễ nhất để truy cập vào tệp cơ sở dữ liệu (chỉ dành cho môi trường gỡ lỗi) là sửa đổi hàm tạo của lớp. Một số câu trả lời sau câu trả lời này (chính xác ở đây: stackoverflow.com/a/21832714/2982814 ), bạn sẽ tìm thấy cách tôi quản lý điều này.
RandomUser,


45

Đối với điều này, những gì tôi đã làm là

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

Và để làm điều này, ứng dụng của bạn phải có quyền truy cập thẻ SD, hãy thêm cài đặt sau vào tệp kê khai.xml của bạn

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

Không phải là một cách tuyệt vời, nhưng hiệu quả.


Đẹp. Tôi vẫn đang tìm kiếm điều này. Người ta cũng có thể chọn tải toàn bộ db lên một máy chủ để phân tích theo cách này.
Jeroen,

3
nếu nó không làm việc ... sử dụng tên cơ sở dữ liệu "/data/data/your.app.package/databases/your_db" Đơn giản chỉ cần loại bỏ các phần mở rộng" .db3"
Nigel Crasto

1
Giải pháp này hoạt động tốt. Tuy nhiên, bạn có thể sử dụng getDatabasePath (your_db_name) để lấy đối tượng Tệp và sử dụng getAbsolutePath () để có được đường dẫn chính xác thay vì xây dựng nó. Phương thức getDatabasePath được định nghĩa trong ContextWrapper.
Roy

Tên tệp và đường dẫn phân biệt chữ hoa chữ thường trong Android.
AndroidDev

29

Context chứa nhiều hàm đường dẫn: Context.getXXXPath ()
Một trong số chúng là android.content.Context.getDatabasePath (String dbname) trả về đường dẫn tuyệt đối của cơ sở dữ liệu được gọi là dbname.

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

Đường dẫn trả về, trong trường hợp này, sẽ giống như sau:

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

Lưu ý rằng đường dẫn này được tạo tự động nếu sử dụng SQLiteOpenHelper để mở DB.


25

Nếu bạn đang nói về thiết bị thực /data/data/<application-package-name>thì không thể truy cập được. Bạn phải có quyền root ...


Điều đó không hoàn toàn đúng. Nó không thể duyệt được , nhưng khả năng truy cập của các tệp bên trong phụ thuộc vào các bit quyền riêng lẻ của chúng.
Chris Stratton

Điện thoại của tôi đã được root. Làm cách nào để "duyệt" thư mục dữ liệu?
Sreecharan Desabattula

@SreecharanDesabattula, bạn cần vào adb shell và chuyển sang superuser bằng cách sử dụng lệnh "su" để duyệt thư mục.
Gautham C.

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

@Sunnyday Trysudo su
Mohammedsalim Shivani

19

Đây là câu hỏi cũ, nhưng trả lời có thể giúp ích cho những người khác.

Không thể tích lũy đường dẫn mặc định nơi Android lưu cơ sở dữ liệu trên các thiết bị không root. Vì vậy, cách dễ nhất để truy cập vào tệp cơ sở dữ liệu (chỉ dành cho môi trường gỡ lỗi) là sửa đổi hàm tạo của lớp:

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

Hãy nhớ thay đổi môi trường sản xuất với các dòng sau:

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

Tôi đã thử điều này và trả lại lỗi Failed to open database '/mnt/sdcard/itens'.trongLogcat
underfilho,

1
Tôi rất xin lỗi. Câu trả lời này là bốn năm tuổi. Và OP cũ hơn thế (2010). Tại thời điểm này, Android đã khác đáng kể so với năm 2010. Vì vậy, vị trí cơ sở dữ liệu có thể nằm trong một đường dẫn khác. Tôi xin lỗi vì tôi không thể giúp được gì nhiều hơn cho bạn.
RandomUser

Có thể lỗi xảy ra do ứng dụng không được phép viết, dù sao cũng cảm ơn
underfilho 22/02

12

/data/data/packagename/databases/

I E

/data/data/com.example.program/databases/


9

Cơ sở dữ liệu SQLite chỉ là một tệp. Bạn có thể lấy tập tin đó, di chuyển nó và thậm chí sao chép nó vào một hệ thống khác (ví dụ: từ điện thoại sang máy trạm của bạn) và nó sẽ hoạt động tốt. Android lưu trữ tệp trong /data/data/packagename/databases/thư mục. Bạn có thể sử dụng adb commandhoặc File Explorer viewtrong Eclipse ( Window > Show View > Other... > Android > File Explorer) để xem, di chuyển hoặc xóa nó.


9

điều này có thể muộn nhưng nó sẽ hữu ích. Bạn có thể truy cập cơ sở dữ liệu mà không cần root thiết bị của mình thông qua adb

bắt đầu adb bằng cmd và nhập các lệnh sau

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

Bây giờ bạn có thể mở từ đây.


4
Có, đối với một APK gỡ lỗi. Không, đối với phiên bản sản xuất (hoặc trên các bản phát hành Android khi chạy như bị hỏng).
Chris Stratton

5

Nếu bạn đặt tên db của mình dưới dạng tệp mà không đưa ra đường dẫn thì cách phổ biến nhất để lấy thư mục của nó là:

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

nơi DBAdapter.DATABASE_NAMEchỉ là một String"mydatabase.db".
Context.getFilesDir()trả về đường dẫn cho các tệp của ứng dụng như: đó là /data/data/<your.app.packagename>/files/lý do tại sao bạn cần .getParent()+"/databases/"xóa "tệp" và thay vào đó thêm "cơ sở dữ liệu".
BTW Eclipse sẽ cảnh báo bạn về chuỗi "data / data /" được mã hóa cứng nhưng không phải trong trường hợp này.


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";

Và kiểm tra xem cơ sở dữ liệu của bạn có được lưu trữ vào Bộ nhớ thiết bị hay không. Nếu Vậy, Bạn phải sử dụng quyền trong Manifest.xml:

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

3

Bạn có thể truy cập nó bằng cách sử dụng adb shell how-to

Nội dung từ liên kết trên:

Hướng dẫn: Cách truy cập cơ sở dữ liệu Android bằng dòng lệnh. Khi bạn bắt đầu xử lý cơ sở dữ liệu trong chương trình của mình, điều thực sự quan trọng và hữu ích là có thể truy cập trực tiếp vào nó, bên ngoài chương trình của bạn, để kiểm tra những gì chương trình vừa thực hiện và gỡ lỗi.

Và điều quan trọng là trên Android.

Đây là cách để làm điều đó:

1) Khởi chạy trình giả lập (hoặc kết nối thiết bị thực của bạn với PC). Tôi thường khởi chạy một chương trình của mình từ Eclipse cho việc này. 2) Khởi chạy dấu nhắc lệnh trong thư mục công cụ android. 3) loại adb shell. Thao tác này sẽ khởi chạy trình bao unix trên trình giả lập / thiết bị được kết nối của bạn. 4) Đi tới thư mục chứa cơ sở dữ liệu của bạn: cd data / data ở đây bạn có danh sách tất cả các ứng dụng trên thiết bị của mình Đi vào thư mục ứng dụng của bạn (hãy cẩn thận, Unix phân biệt chữ hoa chữ thường !!) cd com.alocaly.LetterGame và giảm dần trong thư mục cơ sở dữ liệu của bạn: cd databases Tại đây bạn có thể tìm thấy tất cả các cơ sở dữ liệu của mình. Trong trường hợp của tôi, chỉ có một (bây giờ): SCORE_DB 5) Khởi chạy sqlite trên cơ sở dữ liệu bạn muốn kiểm tra / thay đổi: sqlite3 SCORE_DB Từ đây, bạn có thể kiểm tra bảng nào hiện có: .tables 6) nhập bất kỳ lệnh SQL nào bạn muốn : select * from Score;

Việc này khá đơn giản nhưng mỗi khi cần lại không biết tìm ở đâu.


1

Nếu ứng dụng của bạn tạo cơ sở dữ liệu, cơ sở dữ liệu này theo mặc định được lưu trong thư mục DATA/data/APP_NAME/databases/FILENAME.

Các phần của thư mục trên được xây dựng dựa trên các quy tắc sau. DATA là đường dẫn mà phương thức Environment.getDataDirectory () trả về. APP_NAME là tên ứng dụng của bạn. FILENAME là tên bạn chỉ định trong mã ứng dụng của mình cho cơ sở dữ liệu.


0

Bạn cũng có thể kiểm tra xem IDE của mình có tiện ích như phối cảnh DDMS của Eclipse hay không, cho phép bạn duyệt qua thư mục và / hoặc sao chép tệp vào và từ Trình mô phỏng hoặc thiết bị đã root.


0

Xác định tên cơ sở dữ liệu của bạn như:

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

Và bạn có thể xem cơ sở dữ liệu của mình trong:

storage/sdcard0/yourdatabasename.db

0

public class MySQLiteOpenHelper mở rộng SQLiteOpenHelper {MySQLiteOpenHelper (Context context) {super (context, "/mnt/sdcard/database_name.db", null, 0); }}

Không hardcode "/ sdcard /"; sử dụng Environment.getExternalStorageDirectory (). getPath () để thay thế


0

Không hardcode đường dẫn như thế nào //data/data/<Your-Application-Package-Name>/databases/<your-database-name>. Nó hoạt động trong hầu hết các trường hợp, nhưng điều này không hoạt động trong các thiết bị mà thiết bị có thể hỗ trợ nhiều người dùng. Con đường có thể như thế nào //data/user/10/<Your-Application-Package-Name>/databases/<your-database-name>. Giải pháp khả thi cho điều này là sử dụng context.getDatabasePath(<your-database-name>).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.