2012-10-04 30 views
11

Tôi muốn sử dụng cơ sở dữ liệu "được tải sẵn" trong ứng dụng của mình. Có rất nhiều câu hỏi về điều này và hầu hết chỉ đến bài viết blog này here hoặc similars.Lấy thư mục cơ sở dữ liệu cho ứng dụng của tôi theo chương trình

Cho đến nay rất tốt. Tôi chỉ muốn biết nếu có một cách tốt hơn để có được thư mục cơ sở dữ liệu mặc định để bạn không phải sử dụng một cái gì đó như thế này:

private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/"; 

Ý tôi là, có thể thay đổi trong tương lai hoặc có thể là một thiết bị hoặc rom có ​​thể đặt nó ở nơi khác ... vậy có cách nào để có được con đường này theo chương trình?

Trong bối cảnh tồn tại một phương pháp để getDatabasePath (tên), nhưng bạn cần phải cung cấp cho nó một cái tên db hiện có và cũng ... nó chưa hề tồn tại, tôi muốn di chuyển nó ở đó: P

+0

http://stackoverflow.com/questions/9109438/how-to-use-an-existing-database-with-an-android- ứng dụng/9109728 # 9109728 –

Trả lời

6

Tạo một DB trống, nhận đường dẫn với getDatabasePath(), sau đó ghi đè nó bằng chính bạn.

+1

Tôi đã làm điều này ... nhưng âm thanh như một hack: D Nhưng cũng ... nó chắc chắn hoạt động. –

+4

Vâng, vì không có API chính thức để nhập tệp DB được tạo sẵn, việc đặt tệp của riêng bạn cũng có một bản hack. Ít nhất bạn đang đảm bảo rằng bạn đang đặt nó vào đúng nơi. –

+0

Tôi có cần viết giấy phép cho điều đó không? – Simon

6

Bạn có thể sử dụng Phương thức getFilesDir() hoặc getDatabasePath trong Lớp học hoạt động để lấy Thư mục này.
Thông tin khác here

10

tôi đã sử dụng ...

String destPath = getFilesDir().getPath(); 
destPath = destPath.substring(0, destPath.lastIndexOf("/")) + "/databases"; 
+1

Điều gì xảy ra nếu thư mục thay đổi trong bản phát hành trong tương lai? – pablisco

7

Được sử dụng bởi SQLiteAssetHelper:

String path = mContext.getDatabasePath(mName).getPath(); 

Tại thời điểm này, cơ sở dữ liệu không tồn tại. Tôi nghĩ rằng String chỉ mất đường dẫn nội bộ và thêm các công cụ sửa đổi thích hợp. Thực tế, điều này dường như chỉ hoạt động tốt:

context.getDatabasePath("a").getParentFile() 

Về cơ bản, bạn không cần tạo cơ sở dữ liệu thực, chỉ cần yêu cầu một cơ sở dữ liệu thực.

+2

Thư mục cơ sở dữ liệu có thể không tồn tại trước khi bạn viết/sao chép bất kỳ nội dung nào vào context.getDatabasePath ("a") đảm bảo kiểm tra context.getDatabasePath ("a"). GetParentFile() tồn tại và nếu không tạo thư mục. – nibarius

1

Bạn có thể sử dụng phương pháp getDatabasePath trong lớp Helper của bạn:

public class MyDatabase extends SQLiteAssetHelper { 

    private static final String DATABASE_NAME = "wl.db"; 
    private static final int DATABASE_VERSION = 1; 
    public String databasePath = "";  

    public MyDatabase(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 

     // you can use an alternate constructor to specify a database location 
     // (such as a folder on the sd card) 
     // you must ensure that this folder is available and you have permission 
     // to write to it 
     // super(context, DATABASE_NAME, context.getExternalFilesDir(null).getAbsolutePath(), null, DATABASE_VERSION); 

     databasePath = context.getDatabasePath("wl.db").getPath(); 
    } 
Các vấn đề liên quan