2011-07-07 11 views
0

私はこれを解決するためにネット全体を検索しました。Android SQLite:2番目のアクティビティでデータベースが空になった

私のアプリケーションには、メインメニューをロードする前にSQLiteデータベースを読み込むスタートアップタスクがあります。メインメニューからアクセスできる2番目のアクティビティには、これにアクセスする必要があります。したがって、ロックエラーを止めるために、最初のアクティビティでデータベースを閉じます。

何らかの理由で、同じアクティビティと2番目のアクティビティの両方で、接続を閉じるとすぐにデータベースに行がないようです。

相続人のサンプルコード:

SQLiteDatabase db = getWritableDatabase(); // get instance of current database 

    db.beginTransaction(); // set exclusive mode to speed up 

    for(GulbArticle g : gulbArticles){ 
     this.insert(g); 
    } 

    db.setTransactionSuccessful(); 
    // counting here returns 315 rows using the all2() function below 
    db.close(); 
    // counting here returns 0 rows using the all2() function below 

ここでは、私はそう両方のケースで、私はデータベースのインスタンスを初期化するが、ためだバック

public void all2(){ 
     SQLiteDatabase db = getReadableDatabase(); 
     String sql = "SELECT COUNT(*) FROM "+TABLE_NAME; 
     SQLiteStatement statement =db.compileStatement(sql); 
     long count = statement.simpleQueryForLong(); 
     Log.v("ccount2",count+""); 
} 

カウントを取得するために作られた機能ですもう一度やり直せないとすぐに何らかの理由で閉じてしまいます。データベースには何もないようです。たぶん私は何かシンプルなものを見逃しているが、これは本当に私を困らせている。

答えて

4

db.endTransaction();に電話すること、つまりトランザクションをコミットすることを忘れたようです。 読み込みする必要があります。

db.setTransactionSuccessful(); 
db.endTransaction(); 
db.close(); 

をまた、このようにのtry-catch-finalyでそれを囲むように、良いアイデアです:

try { 
    db.beginTransaction(); 
    // do your DB manipulation 
    db.setTransactionSuccessful(); 
} catch(...) { 
    ... 
} finally { 
    db.endTransaction(); 
} 

db.close(); 
+0

'db.setTransactionSuccessful()'を仮定するとそれを閉じますが、私はブール値を単にトグルすると思います。ありがとう – redroot

1

2番目の活動を開始するときに、データベースをクローズする必要はありません。 SQLiteは通常のDB管理システムです。つまり、このような状況を解決する必要があります。

これは、通常、コードで使用しようとしているトランザクションメカニズムによって解決されます。あなたのケースでは

私はあなたが非eclusive取引使用する必要があると信じて - レコードが排他モードでロックされている場合、すなわち - アクセス不能なので、基本的なイディオムのレコードは次のようになります必要があります:私はいくつかの理由で、

ソートさ
db.beginTransactionNonExclusive(); 
try 
{  
    // do smth  
    db.setTransactionSuccessful(); 
} 
finally 
{  
    db.endTransaction(); 
} 
+0

私はそのNonExclusive関数へのアクセス権を持っていないようですが、それを指摘してくれてありがとうございます。 – redroot

+0

Unfortunatly、beginTransactionNonExclusive()はAPIレベル11(アンドロイド3.0)以上でしか使えません... – ZoltanF

関連する問題