2011-09-23 13 views
11

私のアンドロイドアプリにデータベースを作成していますが、テーブルが作成されていません。私はonCreateメソッドでブレークポイントを追加しました。私のgetWriteableDatabaseとgetWritableDatabaseは呼び出されましたが、onCreateメソッドは呼び出されません。onCreate()がgetWritableDatabase()によって呼び出されていません

package com.fslade.app; 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static final String DATABASE_NAME = "applicationdata"; 
    private static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_TABLE = "peopleT"; 

    // Database creation sql statement 
    private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE + " (_id integer primary key autoincrement, " 
      + "company_name text not null, name text not null, city text not null, vertical text not null, title text not null, email text not null, bio text not null, photo text not null, status text not null);"; 

    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Method is called during creation of the database 
    @Override 
    public void onCreate(SQLiteDatabase database) { 
     database.execSQL(DATABASE_CREATE); 
    } 

    // Method is called during an upgrade of the database, e.g. if you increase 
    // the database version 
    @Override 
    public void onUpgrade(SQLiteDatabase database, int oldVersion, 
      int newVersion) { 
     Log.w(DatabaseHelper.class.getName(), 
       "Upgrading database from version " + oldVersion + " to " 
         + newVersion + ", which will destroy all old data"); 
     database.execSQL("DROP TABLE IF EXISTS todo"); 
     onCreate(database); 
    } 
} 

そして、私のデータベースヘルパーに私は(getWriteableDatabseを呼び出す):

package com.fslade.app; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 

public class ContentStorageHelper { 
    public static final String KEY_ID = "_id"; 
    public static final String KEY_COMPANY_NAME = "company_name"; 
    public static final String KEY_PERSON_NAME = "name"; 
    public static final String KEY_CITY = "city"; 
    public static final String KEY_VERTICAL = "vertical"; 
    public static final String KEY_TITLE = "title"; 
    public static final String KEY_EMAIL = "email"; 
    public static final String KEY_BIO = "bio"; 
    public static final String KEY_PHOTO = "photo"; 
    public static final String KEY_STATUS = "status"; 

    private static final String[] COLUMNS = { KEY_ID, KEY_COMPANY_NAME, 
      KEY_PERSON_NAME, KEY_CITY, KEY_VERTICAL, KEY_TITLE, KEY_EMAIL, 
      KEY_BIO, KEY_PHOTO, KEY_STATUS }; 

    private Context context; 
    private SQLiteDatabase database; 
    private DatabaseHelper dbHelper; 

    public ContentStorageHelper(Context context) { 
     this.context = context; 
    } 

    public ContentStorageHelper open() throws SQLException { 
     dbHelper = new DatabaseHelper(context); 
     database = dbHelper.getWritableDatabase(); 
     // dbHelper.onCreate(database); 
// I added this onCreate() to see if it helped, but when I ran it 
// it said that the database had already been created 
     return this; 
    } 

    public void close() { 
     dbHelper.close(); 
    } 

/** 
* Create a new person If the person is successfully created return the new 
* rowId for that person, otherwise return a -1 to indicate failure. 
*/ 
public long createPerson(String company_name, String name, String city, 
     String vertical, String title, String email, String bio, 
     String photo, String status) { 
    ContentValues initialValues = createContentValues(company_name, name, 
      city, vertical, title, email, bio, photo, status); 

    return database.insert(DatabaseHelper.DATABASE_TABLE, null, 
      initialValues); 
} 

/** 
* Return a Cursor over the list of all people in the database 
* 
* @return Cursor over all notes 
*/ 
public Cursor fetchPeopleByVertical(String vertical) { 
    String selection = KEY_VERTICAL+"="+vertical; 
     Cursor result = database.query(DatabaseHelper.DATABASE_TABLE, COLUMNS, 
       selection, null, null, null, null); 
     return result; 
    } 

    private ContentValues createContentValues(String company_name, String name, 
      String city, String vertical, String title, String email, 
      String bio, String photo, String status) { 
     ContentValues values = new ContentValues(); 
     values.put(KEY_COMPANY_NAME, company_name); 
     values.put(KEY_PERSON_NAME, name); 
     values.put(KEY_CITY, city); 
     values.put(KEY_VERTICAL, vertical); 
     values.put(KEY_TITLE, title); 
     values.put(KEY_EMAIL, email); 
     values.put(KEY_BIO, bio); 
     values.put(KEY_PHOTO, photo); 
     values.put(KEY_STATUS, status); 
     System.out.print("test: " + status); 
     return values; 
    } 
} 
+1

[Android SQLiteOpenHelper:onCreate()メソッドが重複している可能性があります。なぜですか?](http://stackoverflow.com/questions/6791852/android-sqliteopenhelper-oncreate-method-is-not-called-why) – Machavity

答えて

18

作成はのみ(つまり、データベースヘルパーの全体感だ)を1回発生します。

データベースが作成されたかどうかを確認しましたか?それは/data/data/your.package.name/databases/dbnameにあります。

あなたはアンドロイドのアプリケーションの設定でアプリケーションのデータを消去すると、あなたのonCreate再び呼び出さなければなりません...

+0

これはまさに問題の原因です。私はすでに開発の初期段階で実行していましたが、誤ったsql createコマンドを実行しました。 Eclipseでアプリケーション設定をクリアするにはどうすればよいですか? – Francesca

+0

あなたのコードだけで何も変わっていないので、なぜあなたがeclipseでやりたいのかわかりません。既存のアプリケーションデータをデバイスから削除したい場合は、「Android設定>アプリケーション>アプリケーションの管理>アプリケーションの削除>」(名前が一致しなければ申し訳ありません、私のメニューはドイツ語) – Knickedi

+0

すべてのアプリケーションデータを削除したい場合(たとえば、削除したくない他のデータベースがある場合)Android Debug Monitorを使用して、問題のSQLiteデータベースファイルを削除することをおすすめします。私がこのポジションにいたとき、これは私の魅力のように働いた。 – Godsmith

0

SQLiteOpenHelper.onCreate()SQLiteOpenHelper.getWritableDatabase()(またはSQLiteOpenHelper.getReadableDatabase()後の)データベースが存在しない場合にのみ、アプリケーションの後にコールバックされ永続ストレージ(すなわち、SDカード)。言い換えれば、onCreate()は、コードが永続的な記憶域に格納されているデータベースを正常に作成する場合に1回だけ呼び出されます。データベースが永続ストレージに存在し、スキーマを変更している場合は、SQLiteOpenHelper.onUpgrade()を使用します。これは名前でデータベースを開くときに呼び出されますが、以前は使用されていないバージョン番号で呼び出されます。ここで古いスキーマオブジェクトを削除し、SQLiteOpenHelper.onCreate()を呼び出して新しいスキーマを作成します。また、データベースが開かれたときにコードを実行する場合は(SQLiteOpenHelper.get[Writable,Readable]Database()というコードが返されます)、onOpen()を実装してください。次に、SQLiteOpenHelper.onCreate()SQLiteOpenHelper.onOpen()のそれぞれから呼び出されたデータベース(またはデータベースに対して初期化されたコード)を初期化するメソッドを呼び出します。

たとえば、SQLiteDatabaseへの参照を使用して、SQLiteDatabase.execSQL()などのデータ管理メソッドを呼び出すことができます。

void initDB(SQLiteDatabase db) 
{ 
    this.db = db; 
} 

よう

SQLiteOpenHelper.onCreate(SQLiteDatabase db) 

SQLiteOpenHelper.onOpen(SQLiteDatabase db) 

コール何かのそれぞれにおいて

として、あなたが処理する必要があり、あなたのコード内のハンドラをコールバック、他のオブジェクトのライフサイクルイベントがありますが、 Androidはあなたのプロセスをマルチタスクします。しかし、少なくともデータベース処理コードはSQLiteOpenHelper.onCreate()SQLiteOpenHelper.onOpen()を処理する必要があります。

0

私は同じ問題を抱えていました。私は2つのソリューション

  1. 再起動エミュレータに資金を提供し、 私のエミュレータがとても遅い再起動している「ユーザーデータワイプ」チェック...
  2. 変更は、データベースのバージョン番号とそれが再び「OnCreate関数」と呼ばれ、私を与えました私のデータベースのcurretバージョン。私は(大した)

グッドラック

10

それはむしろ愚かな実装の制限です保存された情報を失っていません。 :-)データベース名が.dbの拡張子を持っていることを確認してください。 onCreate()は、拡張子がない場合は呼び出されません。

+1

wow ...ありがとうございます!これは私を狂って運転していた!...愚かな確かに! – Mahm00d

+1

Androidドキュメント内でさえも。彼らが持っている例はそれを持っていません。 http://developer.android.com/training/search/search.html – Neta

+0

WOOOOOOOOOOW THX SO MUCH! このことは私を狂っていました!あなたはルルツ+1 –

0

私は同じ問題を抱えていました。私はSQL_Create文字列の2つのsqlコマンドの間のスペースを忘れてしまったので、必要な列は正しく実装されていませんでしたが、文字列のエラーを見つけて修正したときに、そのデータベースをそのテーブルを持つものとして登録しました。だからonCreateは決して呼び出されませんでした。私にとって、最も簡単な解決策は、バージョン番号を更新することでした。これは新しいdbとテーブルを作成し(正しく)、アプリケーションを修正しました。

関連する問題