2016-09-03 8 views
0

を使用して効率的な方法は、私は自分のアプリケーションでSQLiteのデータベースを実装していると私はAndroidのカーソルを使用しています。私はデータベースクラスを作成しました。データベース名、テーブル名、カラム名を指定します。ここで私はまた、次のように、様々な方法があります:アンドロイド - データベースカーソル

public Cursor getCorrectQuestions(int topic) { 
    SQLiteDatabase db = getReadableDatabase(); 
    Cursor questionCursor = db.rawQuery(
      "Select * FROM Result, Question WHERE Result.qid = Question._id AND correct = 1 AND topic = " + topic, 
      null); 
    questionCursor.moveToFirst(); 
    return questionCursor; 
} 

public Cursor getExamQuestions() { 
    SQLiteDatabase db = getReadableDatabase(); 
    Cursor questionCursor = db.rawQuery("Select * FROM Question WHERE topic = 7", null); 
    questionCursor.moveToFirst(); 
    return questionCursor; 
} 

public Cursor getAnswerItems(String id) { 
    SQLiteDatabase db = getReadableDatabase(); 
    Cursor answerCursor = db.rawQuery(
      "Select * FROM Answer, Question WHERE Question._id = " + id + " AND Question._id = Answer.qid", null); 
    answerCursor.moveToFirst(); 
    return answerCursor; 
} 

public Cursor getUserResults(String qid) { 
    SQLiteDatabase db = getReadableDatabase(); 
    Cursor userResultsCursor = db.rawQuery("SELECT result FROM Result, Answer WHERE Result.qid = " + qid, null); 
    userResultsCursor.moveToFirst(); 
    return userResultsCursor; 
} 

を3つのカーソル(answerCursor、questionCursor、userResultCursor)私はこれらのメソッドを呼び出していQuizActivityで。 私の質問は:それはあらゆる方法でSQLiteDatabaseオブジェクトを作成する必要があるか、それは私のデータベースのコンストラクタで一度これを定義することは可能でしょうか?私の活動では3つの異なるカーソルが必要ですか、これを処理するにはより良い方法がありますか?あなたが書かれている方法を想定し

答えて

2

はあなたが本当に3つのデータベース・オブジェクトを作成していない、SQLiteOpenHelperの一部です。 getReadableDatabase()への唯一の最初の呼び出しは、実際にデータベースオブジェクトを作成し、後続の呼び出しは、再び上で同じオブジェクトを再利用します。

あなたはまた、彼らは作成後に編集することができないように、あなたが実行するクエリごとに新しいCursorを作成する必要があります。この意味で、すでに行ったことを単純化する方法はありません。

  • ContentProviderでデータベースを置くとURIの経由でアクセスして考えてみましょう:

    は限り、あなたのコードの改善として、あなたが見ることができるいくつかあります。これにより、より初期の作業が必要になりますが、他のアプリケーションとデータベースを共有したり、将来、サーバーにデータを同期したりする場合は、もっと簡単になります。

  • はデフォルトの位置(moveToFirst()を呼び出すことはありません)にカーソルを残します。発信者がカーソルを受信した場合、それはさらなるチェックを行うことなく、反復カーソル行を開始するために、次のコードを使用することができ、その方法:

    while (cursor.moveToNext()) { 
        // extract data 
    } 
    

    クエリから返されたカーソルが最初に第一前が配置されているからですカーソルが空の場合、whileループ内のコードは全く実行されません。