web-dev-qa-db-ja.com

Android SQLiteOpenHelper:なぜonCreate()メソッドが呼び出されないのですか?

最初の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();
        }
    }
50
zono

また、SQLiteOpenHelperで問題が発生しました。私のために働いたのは、メンバー変数を保存することでした

SQLiteDatabase db;

SQLiteOpenHelperサブクラスおよび呼び出し

 db = getWritableDatabase();

コンストラクターで。

この質問への回答には、役立つ情報も含まれています: SQLiteOpenHelperがonCreateの呼び出しに失敗しましたか?

これがお役に立てば幸いです!

58
Kevin King

SQLiteOpenHelperクラスのgetWritableDatabase()またはgetReadableDatabase()メソッドを呼び出すまで、データベースは作成されません。

あなたが実際にそれを必要とするときに、そのデータベースがメモリに作成されるのと同じくらい簡単です:)

23
Jatin Malwal

OnCreateが実行されなかった同様の問題がありました。たぶん、これは別の問題であることが判明したとしても、誰かのために役立つでしょう。

私は以前データベースで作業していましたが、ずっと前にすでに作成していました。そのため、onCreate()で変更を行った後、作成された新しいテーブルを見つけたいと思っていました。ただし、SQLiteOpenHelperがonCreate()を再度呼び出すことはありません。その理由は、データベースがすでに存在していたからです。私は以前と同じデバイスで作業していたため、既存の(古い)データベースで作業していました。

しかし、希望はあります。システムは、その名前のデータベースがすでに存在することを認識すると、バージョン番号が正しいかどうかもチェックします。その場合、データベースがすでに存在することを忘れてしまいました。私の解決策は、単にバージョン番号を変更することでした。そのため、onUpgrade()はonCreate()の変更に対するオプションの提供と呼ばれていました。

そのため、オプションは、完全なアプリ(およびデータベース)をアンインストールするか、バージョン番号をアップグレード(および削除など)してから古いテーブルを再作成し、onCreate()を再度呼び出してからonCreateを再度呼び出します。

いずれの場合でも、onCreate()が呼び出されない場合、データベースが存在するかどうかを2回確認してください。それ以外の場合は、再度呼び出されません。

6
Tobias Reich

私は同様の問題を抱えていましたが、問題はOnCreate呼び出しではありませんでした。

上記のサンプルコードでは、Kevinは、データベースが既に存在する場合はOnCreateが呼び出されないことを説明しました。ただし、私のように、別々のアクティビティから複数のテーブルを使用している場合、データベースを既に作成している場合でも、このアクティビティに関連付けられたテーブルはまだ作成されていない可能性があります。したがって、存在しないテーブルにカーソルデータを設定しようとすると、例外が呼び出されます。

私の解決策は、CreateTableオーバーライドとコンストラクターの両方から呼び出されるOnCreateという別のクラスを定義することでした。

db = getWritableDatabase();

1
spleen

Dbファイルが存在するかどうかを確認してから、データベースの書き込み可能なインスタンスを開きます

dbinstance.getWritableDatabase()

0
Ahsan Idrees

私の場合、データベースがすでに存在するため、呼び出されていませんでした!したがって、可能であれば、アプリを削除してからインストールし直してから、アプリが呼び出されているかどうかを確認してください。

0
rsc

私は同じ問題を抱えていました..私のための解決策は、データベース名の拡張子として.dbを追加することでした

0
HelLViS69