2011-07-22 17 views
45

私は最初のAndroidアプリを製作しようとしています。データベースが存在しない場合は、SQLiteOpenHelper.onCreate()メソッドが呼び出されてテーブルが作成されないことに気付きました。しかし、デバッグしようと思ったとしてもonCreate()メソッドが動作しませんでした。Android SQLiteOpenHelper:なぜ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(); 
     } 
    } 
+0

ログ文を入れてみましたか? onCreate()が呼び出されていることを確認するにはどうすればよいですか?ブレークポイントを設定すると、私の観察では、DBヘルパーのメソッドに到達しない傾向があります。 – Suchi

答えて

51

私もSQLiteOpenHelperとのトラブルがありました。どのような私のために働いたことはSQLiteOpenHelperサブクラスで

SQLiteDatabase db; 

メンバ変数を格納し、コンストラクタで

db = getWritableDatabase(); 

を呼び出しました。私はこれが役に立てば幸いSQLiteOpenHelper failing to call onCreate?

この質問への答えにも役立つ情報が含まれています!

+0

はい!あなたが正しいです!私はデータベースを作成することができ、あなたが言及した参照は非常に有用です。ありがとうございました! – zono

+1

db = getWritableDatabase(); - それは私のためにonUpgradeをトリガーするだけですが、onCreateはトリガーしません。何かヒント? – kellogs

+7

これは、データベースがすでに作成されていることを意味します。データベースが存在しない場合にのみ、onCreate()が呼び出されます。 –

20

getWritableDatabase()またはgetReadableDatabase()SQLiteOpenHelperクラスと呼び出すまで、データベースは作成されません。あなたが実際にそれを必要とするとき、そのデータベースをメモリ内に作成されるような単純な

。:)

-1

あなたはAUTOINCREMENTにAUTOのINCREMENTを変更することができます

のonCreate呼び出さ注 SQLiteOpenHelper初めてデータベースが作成されたとき。 onCreateメソッドでテーブルを作成すると、新しいSQLiteDatabaseを作成することはできません。あなたが例

@Override 
 
    public void onCreate(SQLiteDatabase db) { 
 
     String stringCreateTable = "CREATE TABLE "+"tblUser"+" (" + 
 
       "id TEXT PRIMARY KEY, " + 
 
       "name TEXT)"; 
 
     db.execSQL(stringCreateTable); 
 
    }

+5

「AUTOINCREMENTをAUTO INCREMENT_に変更できます」** **あなたはカントできません!! ** – Anup

+0

は魅力的に機能します –

0

を見ることができるしかし私はそれが問題だったOnCreateコールではなかった同様の問題がありました。

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

私のソリューションは、

db = getWritableDatabase();

1

後、私は同じ問題を抱えていたOnCreateオーバーライドからとコンストラクタの両方から呼び出されたCreateTableと呼ばれる別のクラスを定義しました..私のために解像度が追加しました。データベース名の拡張子としてのdb

2

私はonCreateが実行されなかった同様の問題がありました。多分、これは別の問題であることが判明したにもかかわらず、これは誰かのための任意の用途です。

私は前にデータベースを作成していましたが、これまでに長い時間前に作成していました。そこで、onCreate()を変更した後、私は新しいテーブルを作成することを望んでいました。しかし、SQLiteOpenHelperはonCreate()をもう一度呼び出すことはありません。理由は、データベースがすでに存在していたからです。私は以前と同じデバイスで作業していたため、既存の(古い)データベースで作業していました。

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

オプションで、完全なアプリケーション(およびデータベース)をアンインストールするか、古いテーブルをバージョン番号をアップグレードした後(たとえば削除する)にonCreate()を再度呼び出してからonCreateを再呼び出しします。

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

関連する問題