プリロードされたデータベースを使用したい。データベースはアプリケーションに追加され、更新できる必要があります。問題を回避するために接続する方法について、いくつかの疑問があります。問題に対処している専門家に答えてもらいます。ありがとうございました。
私のベースが 1 MB より大きい場合、エラー D/asset (909): データが UNCOMPRESS_DATA_MAX を超えています。1 メガバイト未満の断片に分割でき、増加するように変更できます (".Jpg"、".Jpeg"、".Png"、".Gif"、".wav"、".mp2"、". mp3"、".ogg"、".aac"、".mpg"、".mpeg"、".mid"、".midi"、".smf"、".jet"、".rtttl"、". imy"、".xmf"、".mp4"、".m4a"、".m4v"、".3 gp"、".3 gpp"、".3 g2"、".3 gpp2"、".amr "、".awb"、".wma"、".wmv")。どちらのオプションが優れていますか (簡単 - 拡張子を変更してください)。
「そのようなテーブル android_metadata はありません」と失敗するかもしれませんが、データベース en_US に手動で追加しましたが、アプリケーションが多言語の場合はどうなりますか?
データベースを読み取るときは、mDb = getReadableDatabase (); というメソッドを使用しますが、最後の読み取りは mDb.close (); です。彼らがインターネット上で言うように、データベース ファイルを開けません。これは、特にデバイス HTC 向けです。
以下の引用コード
public class QuestionsDbAdapter extends SQLiteOpenHelper {
private String DATABASE_PATH = "/data/data/YOUR_PACKAGE/";
public static final String DATABASE_NAME = "mantestQuestions";
public static final String TABLE_QUESTIONS = "Questions";
public static final String QUESTIONS_COLUMN_ID = "_id";
public static final String QUESTIONS_COLUMN_QUESTION ="Question";
public static final String TABLE_ANSWERS = "Answers";
public static final String ANSWERS_COLUMN_ID = "_id";
public static final String ANSWERS_COLUMN_QUESTION_ID = "QuestionId";
public static final String ANSWERS_COLUMN_ANSWER = "Answer";
public static final String ANSWERS_COLUMN_POINT = "Point";
private SQLiteDatabase mDb;
private final Context mContext;
private boolean mCreateDatabase = false;
private boolean mUpgradeDatabase = false;
/**
* Constructor
* Takes and keeps a reference of the passed context in order to access
* the application's assets and resources
* @param context
*/
public QuestionsDbAdapter(Context context) {
super(context, DATABASE_NAME, null, context.getResources().getInteger(R.integer.questionDbVersion));
mContext = context;
}
public void initializeDatabase(String path) {
DATABASE_PATH = path;
getWritableDatabase();
if(mUpgradeDatabase) {
mContext.deleteDatabase(DATABASE_NAME);
}
if(mCreateDatabase || mUpgradeDatabase) {
try {
copyDatabase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private void copyDatabase() throws IOException {
close();
InputStream input = mContext.getAssets().open(DATABASE_NAME);
String outFileName = DATABASE_PATH + DATABASE_NAME;
OutputStream output = new FileOutputStream(outFileName);
// Transfer bytes from the input file to the output file
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
output.flush();
output.close();
input.close();
getWritableDatabase().close();
}
public QuestionsDbAdapter open() throws SQLException {
mDb = getReadableDatabase();
return this;
}
public void CleanUp() {
mDb.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
mCreateDatabase = true;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
mUpgradeDatabase = true;
}
/**
* Public helper methods
*/
public Cursor getQuestionById(long rowId) throws SQLException {
Cursor cursor = mDb.query(true, TABLE_QUESTIONS,
new String[] { QUESTIONS_COLUMN_ID, QUESTIONS_COLUMN_QUESTION }, QUESTIONS_COLUMN_ID + "=" + rowId,
null, null, null, null, null);
return cursor;
}
public Cursor getAnswerById(long rowId) throws SQLException {
Cursor cursor = mDb.query(true, TABLE_ANSWERS,
new String[] { ANSWERS_COLUMN_ID, ANSWERS_COLUMN_QUESTION_ID, ANSWERS_COLUMN_ANSWER, ANSWERS_COLUMN_POINT },
ANSWERS_COLUMN_ID + "=" + rowId,
null, null, null, null, null);
return cursor;
}
public Cursor getAnswersByQuestionId(long questionId) throws SQLException {
Cursor cursor = mDb.query(true, TABLE_ANSWERS, new String[] {ANSWERS_COLUMN_ANSWER, ANSWERS_COLUMN_POINT},
ANSWERS_COLUMN_QUESTION_ID + "=" + questionId, null, null, null, null, null);
return cursor;
}
public long getCount() {
String sql = "SELECT COUNT(*) FROM " + TABLE_QUESTIONS;
SQLiteStatement statement = mDb.compileStatement(sql);
long count = statement.simpleQueryForLong();
return count;
}
}