2011-11-04 31 views
8

Trong Android tôi sử dụng phương pháp sau đây để xem cơ sở dữ liệu sqlite có tồn tại không và nếu tôi có thể mở nó và sử dụng nó.Trong Android, hãy kiểm tra xem cơ sở dữ liệu sqlite có tồn tại không theo thời gian

Nếu không thực hiện được thử nghiệm này, tôi sao chép tệp cơ sở dữ liệu từ nội dung (điều này chỉ xảy ra một lần khi người dùng khởi động ứng dụng lần đầu tiên).

/* 
* Check if the database already exist to avoid re-copying the file each time you open the application. 
* @return true if it exists, false if it doesn't 
*/ 
private boolean checkDataBase() { 
    SQLiteDatabase checkDB = null; 

    try { 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
    } catch(SQLiteException e) { 
     //database does't exist yet. 
    } 

    if(checkDB != null){ 
     checkDB.close(); 
    } 
    return checkDB != null ? true : false; 
} 

Vấn đề là tôi nhận được báo cáo từ người dùng nói rằng dữ liệu của họ đã bị xóa và khi điều tra tôi có thể thấy cơ sở dữ liệu được thay thế bằng cơ sở dữ liệu. Vì vậy, đối với một số lý do ngay cả khi người dùng đã có một tập tin cơ sở dữ liệu đôi khi SQLiteDatabase.openDatabase() ném một lỗi. Tôi đã không thể tự mình tạo lại vấn đề nhưng dường như điều đó xảy ra đối với một số người dùng.

Bất kỳ ai có ý tưởng về sự cố có thể có ở đây? Có cách nào tốt hơn để làm bài kiểm tra này không?

+0

Vui lòng trợ giúp với http://stackoverflow.com/questions/20728808/android-reading-stored-sqlite-database – gandharv09

Trả lời

32

Chỉ kiểm tra hệ thống tệp để xem liệu cơ sở dữ liệu có tồn tại thay vì cố gắng mở nó trước không?

Bạn có thể đang cố gắng mở cơ sở dữ liệu đã mở và điều này sẽ gây ra lỗi khiến bạn nghĩ rằng nó không tồn tại.

File database=getApplicationContext().getDatabasePath("databasename.db"); 

if (!database.exists()) { 
    // Database does not exist so copy it from assets here 
    Log.i("Database", "Not Found"); 
} else { 
    Log.i("Database", "Found"); 
} 
+0

Điều này không hiệu quả đối với tôi! Xem http://stackoverflow.com/questions/18391820/checking-if-database-exists –

+3

Tôi chỉ đang cố gắng liên hệ với OP để anh ấy có thể giúp tôi. Tôi đã đăng câu hỏi của riêng mình và liên kết được đưa ra ở trên. Tôi không 'gây ô nhiễm' bất cứ điều gì đơn thuần chỉ yêu cầu giúp đỡ, đó là mục đích của trang web này. –

2

tôi muốn chia sẻ một phương pháp để kiểm tra xem cơ sở dữ liệu tồn tại: Hãy cho tôi một 1 nếu nó chạy tốt cho bạn, Cảm ơn.

private boolean checkDataBase() { 

    SQLiteDatabase checkDB = null; 

    try { 

     File database=myContext.getDatabasePath(DB_NAME); 

     if (database.exists()) { 

      Log.i("Database", "Found"); 

      String myPath = database.getAbsolutePath(); 

      Log.i("Database Path", myPath); 

      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

     } else {     

      // Database does not exist so copy it from assets here 
      Log.i("Database", "Not Found"); 

     } 

    } catch(SQLiteException e) { 

     Log.i("Database", "Not Found"); 

    } finally { 

     if(checkDB != null) { 

      checkDB.close(); 

     } 

    } 

    return checkDB != null ? true : false; 
} 
+0

Không phải là một phương pháp tốt vì nó bị cùng một vấn đề mà OP gặp phải. Nếu cơ sở dữ liệu tồn tại nhưng không thể mở được, nó báo cáo rằng nó không tồn tại. Kiểm tra xem liệu một cơ sở dữ liệu có tồn tại hay không và liệu nó có thể được mở nên là các hoạt động độc lập nếu bạn cần thực hiện cả hai. Ngoài ra điều này là dựa vào một ngoại lệ được ném để xác định trạng thái cơ sở dữ liệu mà không phải là thực hành tốt. – Kuffs

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