2011-09-06 33 views
16

Tôi đang cố gắng sao chép cơ sở dữ liệu hiện có từ thư mục nội dung của mình và thực hiện một số thao tác trên đó. Tất cả mọi thứ đang làm việc tốt nhưng tôi đã nhận được lỗi sau đây trong các file bản ghi của giả lập của tôi:SQLite trả về mã lỗi 14

sqlite returned: error code = 14, msg = cannot open file at source line 25467 

09-06 11:23:41.844: INFO/Database(22560): sqlite returned: error code = 14, msg = cannot open file at source line 25467 
09-06 11:23:41.885: ERROR/Database(22560): sqlite3_open_v2("/data/data/com.dhani.Lazy/databases/LazyDB.sqlite", &handle, 1, NULL) failed 
09-06 11:23:41.885: WARN/System.err(22560): android.database.sqlite.SQLiteException: unable to open database file 
09-06 11:23:41.894: WARN/System.err(22560):  at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
09-06 11:23:41.904: WARN/System.err(22560):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1849) 
09-06 11:23:41.914: WARN/System.err(22560):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820) 
09-06 11:23:41.914: WARN/System.err(22560):  at com.dharani.LazyApple.Database.DataBaseHelper.checkDataBase(DataBaseHelper.java:72) 
09-06 11:23:41.914: WARN/System.err(22560):  at com.dharani.LazyApple.Database.DataBaseHelper.createDataBase(DataBaseHelper.java:47) 
09-06 11:23:41.914: WARN/System.err(22560):  at com.dharani.LazyApple.Database.DataBaseHelper.Login(DataBaseHelper.java:166) 
09-06 11:23:41.914: WARN/System.err(22560):  at com.dharani.LazyApple.Views.LoginView$1.onClick(LoginView.java:63) 
09-06 11:23:41.934: WARN/System.err(22560):  at android.view.View.performClick(View.java:2485) 
09-06 11:23:41.934: WARN/System.err(22560):  at android.view.View$PerformClick.run(View.java:9080) 
09-06 11:23:41.944: WARN/System.err(22560):  at android.os.Handler.handleCallback(Handler.java:587) 
09-06 11:23:41.944: WARN/System.err(22560):  at android.os.Handler.dispatchMessage(Handler.java:92) 
09-06 11:23:41.944: WARN/System.err(22560):  at android.os.Looper.loop(Looper.java:123) 
09-06 11:23:41.944: WARN/System.err(22560):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
09-06 11:23:41.964: WARN/System.err(22560):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-06 11:23:41.964: WARN/System.err(22560):  at java.lang.reflect.Method.invoke(Method.java:507) 
09-06 11:23:41.964: WARN/System.err(22560):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
09-06 11:23:41.964: WARN/System.err(22560):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
09-06 11:23:41.964: WARN/System.err(22560):  at dalvik.system.NativeStart.main(Native Method) 

Bất kỳ đề xuất về cách giải quyết vấn đề này?

+0

Bạn có chắc là bạn có tệp '" /data/data/com.dhani.Lazy/databases/LazyDB.sqlite "'? – Caner

+0

@LAS_VEGAS có, có tệp tại "/data/data/com.dhani.Lazy/databases/LazyDB.sqlite" và tôi cũng có thể thực thi Truy vấn SQLite trên đó. mọi thứ đều hoạt động nhưng trong nhật ký lỗi trên xuất hiện. – Kishore

Trả lời

6

Tôi đã thấy lỗi này xảy ra nếu bạn đang sử dụng sharedUserId trong tệp kê khai của mình. Nếu bạn thay đổi sharedUserId của một ứng dụng và cài đặt lại ứng dụng, nó không có quyền sở hữu bắt buộc để ghi vào cơ sở dữ liệu SQLite.

+0

đây là tệp kê khai của tôi Kishore

+4

Hi Kishore bạn có thay đổi gì đã làm? Tôi cũng đang gặp vấn đề tương tự .... –

3

tôi đã mã lỗi tương tự trên logcat: (! Tôi thực sự không nhận thấy bất kỳ vấn đề cho đến khi tôi nhìn logcat)

sqlite returned: error code = 14, msg = cannot open file at source line

Ứng dụng sẽ chạy tốt. Logcat đã thông báo cho tôi về lỗi này vì vậy tôi nghĩ tốt nhất nên giải quyết vấn đề này ngay bây giờ.

Nó chỉ ra rằng nếu tôi chỉnh sửa tệp kê khai, nó đã loại bỏ lỗi! Trong tệp kê khai của tôi, tôi đã nhập phiên bản sdk tối thiểu không chính xác. Tôi phát hiện ra điều này bởi vì trong tệp kê khai có một chỉ báo chấm than dọc theo cột bên trái của mã thông báo cho tôi về sai lầm của tôi.

Để được triệt để, tôi khuyên bạn nên đảm bảo rằng tất cả các lỗi/dấu chấm than đã được khắc phục để bạn ít nhất cũng có thể loại trừ chúng.

Dường như lỗi này (và nhiều hơn nữa trong nhật thực) có thể xảy ra tùy thuộc vào một số lượng lớn các yếu tố! Oh những niềm vui!

3

Hoặc, một giải pháp dễ dàng mà làm việc đối với tôi là như sau:

  1. Trong tùy chọn cài đặt giả lập của, bấm Ứng dụng
  2. Đến Quản lý ứng dụng
  3. Tìm App của bạn, và nhấn Uninstall
  4. Sau đó chạy lại ứng dụng của bạn từ Eclipse.
+0

ok ... cách nào để gỡ cài đặt và cài đặt mọi chế độ gỡ lỗi thực thi? –

6

Hôm nay vấn đề này khiến tôi mất 3 giờ. Những gì tôi đã thử:

  • Viết lại mã cơ sở dữ liệu sao chép.
  • Xóa ứng dụng từ giả lập/thiết bị
  • Lau giả lập (s)
  • sạch eclipse
  • Thay đổi quyền truy cập file

tôi giải quyết vấn đề bằng cách sao chép mã từ một tài khoản Dropbox chia sẻ một vị trí khác và tái cấu trúc mã trong Tệp kê khai Android và tệp java với một tên gói khác.

Ứng dụng chạy đẹp ngay bây giờ.

+5

Có vẻ như bạn đã có thể tiết kiệm thời gian bằng cách làm sạch. – PearsonArtPhoto

2

Lý do của tôi khác: Tôi đã truy cập phiên bản trực tuyến của ứng dụng, đã tạo cơ sở dữ liệu. Ứng dụng PhoneGap sau đó không thể truy cập tệp được tạo bởi ứng dụng khác. Xóa bộ nhớ cache của trình duyệt đã giải quyết được sự cố của tôi.

2

Bí ẩn được giải quyết, thử nghiệm trong giả lập mà không có DB và đánh dấu chúng sai, vì vậy trước tiên bạn phải tạo DB

InputStream myInput = myContext.getAssets().open(DB_NAME); 

    //Destination folder (where we created the DB empty) 
    String outFileName = DB_PATH + DB_NAME; 

    //We opened it BBDD Vacia as OutputStream 
    OutputStream myOutput = new FileOutputStream(outFileName); 

    //Transfers Bytes between input and output Stream 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer))>0){ 
     myOutput.write(buffer, 0, length); 
    } 

    //Close the open files 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
} 

Sau đó, làm hoạt động của bạn. Chúc may mắn!

8

Điều này có thể hơi muộn, nhưng hy vọng điều này sẽ giúp cho bất kỳ ai gặp vấn đề này (vì tôi không thể tìm thấy giải pháp dứt khoát xung quanh).

Tôi nghĩ rằng tôi biết lý do cho nguyên nhân này (ít nhất là đối với trường hợp của tôi). Nhìn vào DDMS -> File Explorer, bạn sẽ nhận ra rằng Thư mục Cơ sở dữ liệu (/ dữ liệu/dữ liệu // databases /) không tồn tại, đó là lý do tại sao ứng dụng không thể tạo tệp cơ sở dữ liệu thư mục không tồn tại. Nếu bạn có thể tạo một thư mục cơ sở dữ liệu theo cách nào đó, bạn có thể tránh được vấn đề này.

Vì tôi lười, tôi chỉ sử dụng các tệp /dữ liệu/dữ liệu ///thư mục khi tôi đang ở chế độ Trình mô phỏng. Bạn có thể nhận được thư mục tệp bằng cách sử dụng:

context.getFilesDir().getPath() 

Điều này làm việc tốt cho tôi trong Trình giả lập.

Hy vọng điều này sẽ giúp ai đó.

Trong trường hợp bạn muốn xem một số mã:

String dbFilename = "example.db"; 
try 
{  
    File databaseFile = getDatabasePath(dbFilename);   
     SQLiteDatabase _db = SQLiteDatabase.openOrCreateDatabase(databaseFile); 
} catch (Exception e) 
{ 
    String databasePath = getFilesDir().getPath() + "/" + dbFilename; 
    File databaseFile = new File(databasePath); 
    _db = SQLiteDatabase.openOrCreateDatabase(databaseFile); 
} 

EDIT: Tôi cố gắng đăng nhập vào Facebook (ứng dụng của tôi có FB tích hợp) trên Emulator và thư mục/cơ sở dữ liệu xuất hiện sau đó (và vẫn kiên trì). Bạn không chắc chắn những gì đã xảy ra, nhưng có thể tạo thư mục đó bằng cách nào đó. Một cái gì đó cho một chuyên gia khác xung quanh đây để làm sáng tỏ.

+0

tôi có cùng một logcat ... kiểm tra tên db của bạn không có mũ nhân vật trong chuỗi của mình –

2

Tôi đã giải quyết được điều này bằng cách nhận ra rằng tài liệu hơi gây hiểu nhầm. Bạn cần phải có một tên tệp cho tài sản được nén của bạn có liên quan đến tên cơ sở dữ liệu của bạn. Ví dụ: nếu cơ sở dữ liệu của bạn được gọi là someData.db, tệp zip của bạn phải là someData.zip.

Ngoài ra, có vẻ như có chẩn đoán tốt hơn một chút nếu bạn thử mở một db có thể ghi. Tôi đã làm trong các nhà xây dựng, như sau, đó là những gì cuối cùng đã giúp tôi để tìm ra giải pháp.

SQLiteDatabase db=getWritableDatabase(); 
db.close(); 
+0

tôi đổi tên db của tôi có CAPS char trong lá thư đầu tiên? và giải quyết .. điều này là đúng? –

6

Tôi cũng gặp vấn đề tương tự.

gì giải quyết nó, đã được thay thế

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

với

String myPath = myContext.getFilesDir().getAbsolutePath().replace("files", 
"databases")+File.separator + DB_NAME; 
+1

db của tôi nằm trong "/ data/data/YOUR_PACKAGE/files /". Nó có phải nằm trong thư mục con "cơ sở dữ liệu" không? – gdbj

+0

Có, hãy đặt nó vào thư mục 'cơ sở dữ liệu' – SteBra

+0

Cuối cùng tôi cũng đã làm việc của mình. muốn khoanh tròn lại rằng nó hoạt động tốt trong thư mục con "files". – gdbj

2

Hãy chắc chắn rằng bạn đóng tất cả các con trỏ và các trường hợp db. Tôi đã gặp lỗi này do thực hiện nhiều lần chèn và cập nhật và không đóng các con trỏ, gây rò rỉ con trỏ và không thể mở db.

+0

cảm ơn! thêm cursor.close() đã giúp tôi. –

Các vấn đề liên quan