0

このコードはアプリケーションをクラッシュさせます。静的変数からデータベース名を参照すると、機能します。strings.xmlから取得しようとすると、アプリがクラッシュします。なぜ失敗するのか分かりますか?これはアクティビティではないクラスなので、android.content.res.Resourcesをインポートしました。また、context.getStringを試してみると、クラッシュします。

import android.content.Context;
import android.content.res.Resources;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {

//public static final String DATABASE_NAME = "library.db";
public static final String TITLE = "title";
public static final String AUTHOR = "author";
public static final String ISBN = "isbn";


public DatabaseHelper(Context context) {
    super(context, Resources.getSystem().getString(R.string.DATABASE_NAME), null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE books (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT, isbn TEXT);");

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

}

}

4

3 に答える 3

1

データベース名に文字列リソースを使用する必要はありません。実際、あまり意味がありません。文字列リソースは主に、他の構成(具体的には他の言語)に代替リソースを提供できるように、ユーザーに表示されるすべてのものに使用されます。提供するのは、基本的にデータベースのファイル名です。これは完全にアプリの内部であり、ユーザーには表示されないため、データベースファイルに必要な名前の静的な最終文字列を使用する必要があります。

/* Database file name */
private static final String BD_NAME = "something.db";

public DatabaseHelper(Context context) {
    super(context, DB_NAME, null, null);
}
于 2013-01-02T04:35:26.657 に答える
0

間違っています

super(context, Resources.getSystem().getString(R.string.DATABASE_NAME), null, 1);

これを試して

super(context, context.getResources().getString(R.string.DATABASE_NAME), null, 1);
于 2013-01-02T04:20:45.640 に答える
0

変化する Resources.getSystem().getString(R.string.DATABASE_NAME)

context.getResources().getString(R.string.DATABASE_NAME)
于 2013-01-02T04:21:14.997 に答える