最初のAndroidアプリを作成しようとしています。データベースが存在しない場合、テーブルを作成するためにSQLiteOpenHelper.onCreate()
メソッドが呼び出されないことに気付きました。しかし、onCreate()
メソッドは、デバッグしようとしても機能しませんでした。
以下のコードを見て、提案をお願いします。任意の助けをいただければ幸いです。
public class NameToPinyinActivity extends Activity {
DatabaseOpenHelper helper = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nametopinyin);
Button searchButton = (Button) findViewById(R.id.search);
searchButton.setOnClickListener(new ButtonClickListener());
helper = new DatabaseOpenHelper(NameToPinyinActivity.this);
}
public class DatabaseOpenHelper extends SQLiteOpenHelper {
/** DB Name */
private static final String DB_NAME = "pinyin";
/** CREATE TABLE SQL */
private static final String CREATE_TABLE_SQL = "CREATE TABLE UNICODE_PINYIN"
+ "(ID INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "UNICODE TEXT NOT NULL, PINYIN TEXT NOT NULL)";
public DatabaseOpenHelper(Context context) {
super(context, DB_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.beginTransaction();
try {
db.execSQL(CREATE_TABLE_SQL);
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
db.endTransaction();
}
}
また、SQLiteOpenHelperで問題が発生しました。私のために働いたのは、メンバー変数を保存することでした
SQLiteDatabase db;
SQLiteOpenHelperサブクラスおよび呼び出し
db = getWritableDatabase();
コンストラクターで。
この質問への回答には、役立つ情報も含まれています: SQLiteOpenHelperがonCreateの呼び出しに失敗しましたか?
これがお役に立てば幸いです!
SQLiteOpenHelper
クラスのgetWritableDatabase()
またはgetReadableDatabase()
メソッドを呼び出すまで、データベースは作成されません。
あなたが実際にそれを必要とするときに、そのデータベースがメモリに作成されるのと同じくらい簡単です:)
OnCreateが実行されなかった同様の問題がありました。たぶん、これは別の問題であることが判明したとしても、誰かのために役立つでしょう。
私は以前データベースで作業していましたが、ずっと前にすでに作成していました。そのため、onCreate()で変更を行った後、作成された新しいテーブルを見つけたいと思っていました。ただし、SQLiteOpenHelperがonCreate()を再度呼び出すことはありません。その理由は、データベースがすでに存在していたからです。私は以前と同じデバイスで作業していたため、既存の(古い)データベースで作業していました。
しかし、希望はあります。システムは、その名前のデータベースがすでに存在することを認識すると、バージョン番号が正しいかどうかもチェックします。その場合、データベースがすでに存在することを忘れてしまいました。私の解決策は、単にバージョン番号を変更することでした。そのため、onUpgrade()はonCreate()の変更に対するオプションの提供と呼ばれていました。
そのため、オプションは、完全なアプリ(およびデータベース)をアンインストールするか、バージョン番号をアップグレード(および削除など)してから古いテーブルを再作成し、onCreate()を再度呼び出してからonCreateを再度呼び出します。
いずれの場合でも、onCreate()が呼び出されない場合、データベースが存在するかどうかを2回確認してください。それ以外の場合は、再度呼び出されません。
私は同様の問題を抱えていましたが、問題はOnCreate
呼び出しではありませんでした。
上記のサンプルコードでは、Kevinは、データベースが既に存在する場合はOnCreate
が呼び出されないことを説明しました。ただし、私のように、別々のアクティビティから複数のテーブルを使用している場合、データベースを既に作成している場合でも、このアクティビティに関連付けられたテーブルはまだ作成されていない可能性があります。したがって、存在しないテーブルにカーソルデータを設定しようとすると、例外が呼び出されます。
私の解決策は、CreateTable
オーバーライドとコンストラクターの両方から呼び出されるOnCreate
という別のクラスを定義することでした。
db = getWritableDatabase();
Dbファイルが存在するかどうかを確認してから、データベースの書き込み可能なインスタンスを開きます
dbinstance.getWritableDatabase()
私の場合、データベースがすでに存在するため、呼び出されていませんでした!したがって、可能であれば、アプリを削除してからインストールし直してから、アプリが呼び出されているかどうかを確認してください。
私は同じ問題を抱えていました..私のための解決策は、データベース名の拡張子として.dbを追加することでした