2013-01-03 1 views
0

Je travaille avec une base de données SQLite mais l'erreur suivante est android.database.sqlite.SQLiteCantOpenDatabaseException. Mon activité ressemble à ceci: J'essaie d'interroger la base de données deux fois dans la même activité. Et j'initialise la DB et le curseur chaque fois séparément.SQliteDatabase: Erreur SQLiteCantOpenDatabaseException, veuillez passer en revue

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(); 
    } 

Je suppose l'erreur due à ne pas fermer la base de données appropriée. Quelqu'un pourrait-il revoir mon code? Ci-dessous est ma classe d'assistance .

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

Mon logcat ressemble à ceci:

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

Affichez votre sortie Logcat. – varevarao

+0

Assurez-vous que votre problème se trouve dans votre affectation 'DBPath'. Etes-vous sûr que le chemin et tous les répertoires le long existent? Si vous recherchez un stockage interne, vous n'avez pas besoin de fournir de chemin et, si vous envisagez d'utiliser sdcard, utilisez 'getExternalStorageDir()'. Note: Par convention, les membres de la classe sont en minuscules et les noms de classe sont en majuscules. – 323go

Répondre

0

J'ai un problème similaire il y a longtemps. Essayez ceci

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