0

SQLiteDatabase を使用していますが、次のエラーが発生しますandroid.database.sqlite.SQLiteCantOpenDatabaseException。私のアクティビティは次のようになります。同じアクティビティで DB に 2 回クエリを実行しようとしています。そして、毎回個別にDBとカーソルを初期化しています。

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

DBを適切に閉じていないためにエラーが発生したと想定しています。誰かが私のコードを見直してもらえますか? 以下は私のヘルパークラスです。

    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)
4

1 に答える 1

0

私はずっと前に同様の問題を抱えています。これを試して

@Override
protected void onDestroy() {
    super.onDestroy();
    if (c!= null)
        c.close();
    if (dbHelper != null) {
        dbHelper.close();
    }
}
于 2013-01-03T22:11:44.963 に答える