私はEditTextに質問を挿入し、答えとして文字列を返す 'Talk to the Flash'アプリケーションを作成しています。質問と回答を同じテーブルに保存したデータベースを作成しましたが、それぞれの質問とそれに対応する回答が同じ行にある別の列にあります。SQLiteデータベースを使用しようとするとAndroidアプリがフリーズします
私の問題は、アプリケーションを実行しようとすると、入力された質問の回答を探すボタンを押すとフリーズする(answerToQuestionメソッドを使用して質問をパラメータとして渡す)
解決策を探してみましたが見つかりませんでした。
これは私のデータベースハンドラクラス(その中にコピーされたすべてのもの)である:
package com.beacon.talktotheflash;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.Cursor;
oimport android.content.Context;
public class MyDBHandler extends SQLiteOpenHelper{
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "flash.db";
private static final String TABLE_QANDA = "questions_and_answers";
private static final String COLUMN_ID = "id";
private static final String COLUMN_QUESTIONS = "questions";
private static final String COLUMN_ANSWERS = "answers";
public MyDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
// Initializes the database
@Override
public void onCreate(SQLiteDatabase db) {
String query = "CREATE TABLE " + TABLE_QANDA + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_QUESTIONS + " TEXT, " +
COLUMN_ANSWERS + " TEXT);";
db.execSQL(query);
listOfQandA(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_QANDA);
onCreate(db);
}
// List of the questions and answers
public void listOfQandA(SQLiteDatabase db){
String query = "INSERT INTO " + TABLE_QANDA + " (" + COLUMN_QUESTIONS + ", " + COLUMN_ANSWERS + ") "
+ " VALUES(\"hello\", \"Hi says the Flash!\")";
db.execSQL(query);
}
// Get the answer for the provided question
public String answerToQuestion(String question){
// Check if the question and the answer are in the same row
// by using a cursor
SQLiteDatabase db = getWritableDatabase();
String final_answer = "";
String query1 = "SELECT " + COLUMN_QUESTIONS + " FROM " + TABLE_QANDA + " WHERE 1";
String query2 = "SELECT " + COLUMN_ANSWERS + " FROM " + TABLE_QANDA + " WHERE 1";
// Cursor point to a location in a column
Cursor c1 = db.rawQuery(query1, null);
Cursor c2 = db.rawQuery(query2, null);
// Move to the first row in column_questions
c1.moveToFirst();
while(!c1.isAfterLast()){
if (c1.getString(c1.getColumnIndex("questions")).equals(question)){
int c1_position = c1.getPosition();
c2.moveToPosition(c1_position);
final_answer = c2.getString(c2.getColumnIndex("answers"));
}
}
c1.close();
c2.close();
return final_answer;
}
}
長時間実行する操作は、別のスレッドで実行する必要があります。 –
私はこの質問に何もないが、あなたは[Realm.io](https://realm.io/docs/java/latest/)について既に聞いていましたか?これはSQLliteの素晴らしいフレームワークです。 –