2011-09-23 59 views
11

我正在写我的android应用程序的数据库,但我的表没有被创建。我在我的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

创建仅发生一次(这是一个数据库助手的整个意义上的)。

您是否检查数据库是否已创建?它位于/data/data/your.package.name/databases/dbname

如果您在Android应用程序设置清除应用程序数据,您应该onCreate再次调用...

+0

这正是问题所在。在开发早期,我已经运行了Create,但是使用格式错误的sql create命令。如何清除Eclipse中的应用程序设置? – Francesca

+0

我不明白你为什么想在eclipse中做什么,因为没有什么改变,因为它只是你的代码。如果你想从设备中删除现有的应用程序数据,请进入'Android设置>应用程序>管理应用程序>你的应用程序>删除数据'(对不起,如果名称不匹配,我的菜单是德语) – Knickedi

+0

如果你不想要删除所有的应用程序数据(如果有其他数据库工作正常,你不想删除例如)我建议通过Android调试监视器,并删除只有有问题的SQLite数据库文件。当我处于这个位置时,这对我来说就像是一种魅力。 – Godsmith

0

SQLiteOpenHelper.onCreate()之后SQLiteOpenHelper.getWritableDatabase()(或SQLiteOpenHelper.getReadableDatabase()之后),只有当数据库中不存在中的应用程序的回调持久存储(即SD卡)。换句话说,如果代码成功地创建了一个存储在持久性存储中的数据库,则仅调用onCreate()一次。如果数据库存在于永久性存储中,但您正在更改其架构,则可以使用SQLiteOpenHelper.onUpgrade(),当您按名称打开数据库时,会使用SQLiteOpenHelper.onUpgrade(),但使用之前未使用过的版本号来调用该数据库。在其中删除旧的模式对象,然后在其中调用SQLiteOpenHelper.onCreate()来创建新的模式。如果您想在打开数据库时运行代码(代码由SQLiteOpenHelper.get[Writable,Readable]Database()调用),请执行onOpen()。然后调用一个方法来初始化您的数据库(或根据您的数据库初始化的代码),该方法从SQLiteOpenHelper.onCreate()SQLiteOpenHelper.onOpen()中分别调用。

例如,您可能希望使用对SQLiteDatabase的引用,对其调用SQLiteDatabase.execSQL()等数据管理方法。

在每个

SQLiteOpenHelper.onCreate(SQLiteDatabase db) 

SQLiteOpenHelper.onOpen(SQLiteDatabase db) 

呼叫类似

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

有一些回调在代码中的处理程序,你应该处理其他对象生命周期事件, Android多任务您的过程。但至少您的数据库处理代码必须处理SQLiteOpenHelper.onCreate()SQLiteOpenHelper.onOpen()

0

我有同样的问题。我资助2个解决方案

  1. 重新启动模拟器,并检查“擦拭用户数据” 我的模拟器是重新启动缓慢,...
  2. 更改数据库的版本号并再次将其称为“在OnCreate”,给了我我的数据库的curret版本。我失去了存储的信息(没什么大不了)

好运

10

这是一个相当愚蠢实施限制。 :-)确保数据库名称的扩展名为.db。如果没有扩展名,则不会调用onCreate()

+1

哇...非常感谢你!这让我疯狂!......真的很愚蠢! – Mahm00d

+1

甚至没有在Android文档中。他们的例子没有。 http://developer.android.com/training/search/search.html – Neta

+0

WOOOOOOOOOOOW THX这么多! 这件事让我疯狂! +1伙计你rulz –

0

我遇到了同样的问题。我忘记了SQL_Create字符串中两个sql命令之间的空格,所以我需要的列没有正确实现,但是当我找到并修复了String中的错误时,它没有解决问题,因为App已经将该数据库注册为具有该表格。所以onCreate从未被调用过。对我而言,最简单的解决方案是更新版本号。这创建了一个新的数据库和表(正确),并修复了应用程序。

相关问题