我正在尝试制作我的第一个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?
我希望这有帮助!
直到你调用该方法getWritableDatabase()
或getReadableDatabase()
的SQLiteOpenHelper
类,数据库将不会被创建。
实际需要时,将在内存中创建该数据库一样简单。:)
我有一个类似的问题,即未执行onCreate。也许这对某人有用,即使事实证明这是一个不同的问题。
我以前在数据库上工作,并且已经创建了很长时间。所以现在在onCreate()进行更改之后,我希望找到创建的新表。但是SQLiteOpenHelper再也没有调用过onCreate()。原因是,数据库已经存在。我仍在使用与以前相同的设备,因此仍在使用现有的(旧)数据库。
但是有希望。当系统看到具有该名称的数据库已经存在时,它还会检查版本号是否正确。在那种情况下,我只是忘记了数据库已经存在。我的解决方案只是更改版本号。因此,onUpgrade()被称为提供onCreate()更改的选项。
因此,选择要么卸载整个应用程序(以及数据库),要么在升级版本号(例如删除旧表)并再次调用onCreate()之后再次调用onCreate。
无论如何,如果未调用onCreate(),请检查数据库是否存在两次。否则将不会再次调用。
我有一个类似的问题,但这不是OnCreate
问题所在。
在上面的示例代码中,凯文解释说,OnCreate
如果数据库已经存在,则不会调用。但是,如果像我一样,您正在使用来自不同活动的多个表,那么尽管您可能已经创建了数据库,但可能尚未创建与此活动关联的表。因此,当您尝试在不存在的表上设置游标数据时,将调用异常。
我的解决方案是定义一个单独的类,该类CreateTable
从OnCreate
覆盖和构造函数之后调用
db = getWritableDatabase();
调用getWritableDatabase(); 在构造函数中
public DataBaseH(@Nullable Context context) {
super(context, dataBaseName, null, dataBaseVersion);
SQLiteDatabase db=this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable="CREATE TABLE IF NOT EXISTS "+tableName+ " ( "+
id+ " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"+
name+ " TEXT,"+
familyName+ " TEXT,"+
age+ " INTEGER);";
db.execSQL(createTable);
Log.i(TAG,"db.exect");
}
我在应用程序首次运行时就遇到了类似的问题,即onCreate()无法执行,因此我的数据库从未创建过。这与不执行onCreate()的情况不同,因为该数据库已经存在,因为该数据库尚不存在。具体来说,我的DataProvider onCreate()未执行,因此从未调用过OpenHelper。
我确认我已经按照前面的答案中每个人的描述进行了所有设置,但没有任何解决方案可以解决我的问题。张贴此答案,以防其他人像我一样忘记一个小细节。
为我解决了这个问题的是,在AndroidManifest.xml中为我的数据提供者添加了一个条目,该条目嵌套在标签中,并包含所有条目。我唯一需要的属性是:
- android:name =“。DataManagement.DbDataProvider”
- android:authorities =“ com.example.myApplicationName.DataManagement.DbDataProvider”
- android:exported =“ false”
(确保更改以上属性的值以匹配您的项目)
我为数据提供者清理,构建,运行和onCreate()方法,并正确执行打开的帮助程序类,并且在首次启动应用程序时创建了数据库!
我有同样的问题..我的解决方法是将.db作为数据库名称的扩展名添加
就我而言,因为数据库已经存在而没有被调用!因此,如果可能,请确保删除您的应用并重新安装,然后再检查是否被调用。
在似乎未执行onCreate的情况下,我遇到了同样的问题。我以为是因为未显示我的日志。原来我的SQL_create字符串中的空格有问题。
@Override
public void onCreate(SQLiteDatabase db) {
try {
Log.d(LOG_TAG, "A table is created with this SQL-String: " + SQL_CREATE + " angelegt.");
db.execSQL(SQL_CREATE);
}
catch (Exception ex) {
Log.e(LOG_TAG, "Error when creating table: " + ex.getMessage());
}
}
这是我更正的SQL字符串:
enterpublic static final String SQL_CREATE =
"CREATE TABLE " + TABLE_VOCAB_LIST +
"(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_GERMAN + " TEXT NOT NULL, " +
COLUMN_SPANISH + " INTEGER NOT NULL, "+
COLUMN_LEVEL + " INTEGER NOT NULL);)"; code here
我忘记了一个空格,当我添加空格时,一切正常。
您可以将AUTOINCREMENT更改为AUTO INCREMENT
注意
SQLiteOpenHelper首次创建数据库时调用onCreate。如果使用onCreate方法创建表,则无法创建新的SQLiteDatabase。你可以看例子
@Override
public void onCreate(SQLiteDatabase db) {
String stringCreateTable = "CREATE TABLE "+"tblUser"+" ( " +
"id TEXT PRIMARY KEY, " +
"name TEXT )";
db.execSQL(stringCreateTable);
}
文章标签:android , android-sqlite , java
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
评论已关闭!