2013-01-03 46 views
0

我正在使用SQLiteDatabase,但出現以下錯誤android.database.sqlite.SQLiteCantOpenDatabaseException。我的活動看起來像這樣:我試圖在同一活動中查詢數據庫兩次。我每次分別初始化數據庫和光標。SQliteDatabase:SQLiteCantOpenDatabaseException錯誤,請查看

try { 
     DBHelper dbHelper = new DBHelper(this.getApplicationContext()); 
     MyData = dbHelper.getWritableDatabase(); 
     Cursor c = MyData.rawQuery("SELECT * FROM " + tableName 
       + " where Category = '" + category + "'", null); 

     results.clear(); 
     if (c != null) { 
      if (c.moveToFirst()) { 
       do { 
        String subcat = c.getString(c 
          .getColumnIndex("Subcategory")); 

        results.add(subcat); 
       } while (c.moveToNext()); 
      } 
      c.close(); 
     } 
    } catch (SQLiteException se) { 
     Log.e(getClass().getSimpleName(), 
       "Could not create or Open the database"); 
    } finally { 
     if (MyData != null) 
      MyData.execSQL("DELETE FROM " + tableName); 
     MyData.close(); 
    } 

我假設由於沒有適當關閉數據庫而導致錯誤。有人可以查看我的代碼嗎?以下是我的幫手類

public SQLiteDatabase DB; 
public String DBPath; 
public static String DBName = "sampledatabase"; 
public static final int version = '1'; 
public static Context currentContext; 
public static String tableName = "MyDatabaseapp"; 

private static DBHelper mInstance = null; 

public DBHelper getInstance(Context activityContext) { 

    // Get the application context from the activityContext to prevent leak 
    if (mInstance == null) { 

     mInstance = new DBHelper(activityContext.getApplicationContext()); 

    } 
    return mInstance; 
} 

public DBHelper(Context applicationContext) { 
    super(applicationContext, DBName, null, version); 

    currentContext = applicationContext; 
    DBPath = "/data/data/" + applicationContext.getPackageName() 
      + "/databases";  
    createDatabase(); 

} 
@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
} 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // TODO Auto-generated method stub 

} 

private void createDatabase() { 
    boolean dbExists = checkDbExists(); 

    if (dbExists) { 
     // do nothing 

    } else { 
     DB = currentContext.openOrCreateDatabase(DBName, 0, null); 
     DB.execSQL("CREATE TABLE IF NOT EXISTS " + tableName 
       + " (Category VARCHAR, Subcategory VARCHAR," 
       + " Imageurl VARCHAR, Position INT(3));"); 

     DB.execSQL("INSERT INTO " 
       + tableName 
       + " Values ('0','HOT TUB','http://www.massagetherapyreviews.com',1);"); 
     DB.execSQL("INSERT INTO " 
       + tableName 
       + " Values ('0','RADIANT','http://www.massagetherapyreviews.com',2);"); 

     DB.close(); 
    } 

} 

private boolean checkDbExists() { 
    SQLiteDatabase checkDB = null; 

    try { 
     String myPath = DBPath + DBName; 
     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; 
    } 

我logcat的是這樣的:

01-04 01:47:20.572: E/SQLiteDatabase(10274): close() was never explicitly called on database '/data/data/com.afsmedia.android/databases/sample' 
01-04 01:47:20.572: E/SQLiteDatabase(10274): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
01-04 01:47:20.572: E/SQLiteDatabase(10274): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:2072) 
01-04 01:47:20.572: E/SQLiteDatabase(10274): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1126) 
01-04 01:47:20.572: E/SQLiteDatabase(10274): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1083) 
01-04 01:47:20.572: E/SQLiteDatabase(10274): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1059) 
01-04 01:47:20.572: E/SQLiteDatabase(10274): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1162) 
+0

發佈您的Logcat輸出。 – varevarao

+0

很確定你的問題出在你的'DBPath'任務上。你確定路徑和它的所有目錄是否存在?如果您正在尋找內部存儲器,則不需要提供路徑,如果您打算使用SD卡,請使用'getExternalStorageDir()'。 備註:按照慣例,班級成員爲小寫,班級名稱爲大寫。 – 323go

回答

0

我有一個類似的問題在很久以前。試試這個

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (c!= null) 
     c.close(); 
    if (dbHelper != null) { 
     dbHelper.close(); 
    } 
}