Android 此.getWritableDatabase()未调用onCreate()
我知道类似的问题以前也被问过很多次;但在浏览了几个小时的帖子后,我还没有找到解决办法。我的SQLite实现拒绝正常工作,并且没有创建数据库,即使我正在调用getWritableDatabase。我曾尝试卸载并重新安装该应用程序,以删除可能存在的空数据库,但没有成功。logcat中的错误如下所示:Android 此.getWritableDatabase()未调用onCreate(),android,sqlite,oncreate,getwritabledatabase,Android,Sqlite,Oncreate,Getwritabledatabase,我知道类似的问题以前也被问过很多次;但在浏览了几个小时的帖子后,我还没有找到解决办法。我的SQLite实现拒绝正常工作,并且没有创建数据库,即使我正在调用getWritableDatabase。我曾尝试卸载并重新安装该应用程序,以删除可能存在的空数据库,但没有成功。logcat中的错误如下所示: -25 09:19:48.924 6149-6149/com.nikhilp.thecashcontroller E/AndroidRuntime﹕ FATAL EXCEPTION: main P
-25 09:19:48.924 6149-6149/com.nikhilp.thecashcontroller E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.nikhilp.thecashcontroller, PID: 6149
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nikhilp.thecashcontroller/com.nikhilp.thecashcontroller.activity.MainActivity}: android.database.sqlite.SQLiteException: no such table: expenses (code 1): , while compiling: SELECT * FROM expenses
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: android.database.sqlite.SQLiteException: no such table: expenses (code 1): , while compiling: SELECT * FROM expenses
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255)
at com.nikhilp.thecashcontroller.MyDBHandler.getExpenses(MyDBHandler.java:109)
at com.nikhilp.thecashcontroller.activity.MainActivity.onCreate(MainActivity.java:104)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)...
-25 09:19:48.924 6149-6149/com.nikhip.thecash控制器E/AndroidRuntime﹕ 致命异常:主
进程:com.nikhip.thecashcontroller,PID:6149
java.lang.RuntimeException:无法启动activity ComponentInfo{com.nikhip.thecashcontroller/com.nikhip.thecashcontroller.activity.MainActivity}:android.database.sqlite.SQLiteException:没有这样的表:费用(代码1):,编译时:从费用中选择*
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
在android.app.ActivityThread.access$800(ActivityThread.java:151)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:135)
位于android.app.ActivityThread.main(ActivityThread.java:5257)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
原因:android.database.sqlite.SQLiteException:无此表:费用(代码1):,编译时:从费用中选择*
位于android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法)
位于android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
位于android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
位于android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
位于android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)
位于android.database.sqlite.SQLiteQuery(SQLiteQuery.java:37)
位于android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
位于android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
位于android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255)
位于com.nikhip.thecashcontroller.MyDBHandler.getExpenses(MyDBHandler.java:109)
位于com.nikhip.thecashcontroller.activity.MainActivity.onCreate(MainActivity.java:104)
位于android.app.Activity.performCreate(Activity.java:5990)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)上。。。
创建时的主要活动(关于数据库)
公共MyDBHandler MyDBHandler;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
myDBHandler=新的myDBHandler(此);
ArrayList temp=myDBHandler.getExpenses();
显示视图(0);
}
数据库处理程序
package com.nikhilp.thecashcontroller;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;
import java.util.ArrayList;
public class MyDBHandler extends SQLiteOpenHelper{
private Context context;
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "cashdatabase.db";
public static final String TABLE_EXPENSES = "expenses";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_AMOUNT = "_amount";
public static final String COLUMN_NOTE = "_note";
public static final String COLUMN_DATE = "_date";
public static final String COLUMN_CATEGORY = "_category";
public SQLiteDatabase db1;
private static final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS "+ TABLE_EXPENSES+"(" +
COLUMN_ID+ " INTEGER PRIMARY KEY AUTOINCREMENT" +
COLUMN_AMOUNT+ " TEXT " +
COLUMN_NOTE+ " TEXT " +
COLUMN_CATEGORY+ " TEXT "+
COLUMN_DATE+" TEXT" + ");";
private static final String DROP_TABLE = "DROP TABLE IF EXISTS "+TABLE_EXPENSES;
public MyDBHandler(Context context) {
super(context, DATABASE_NAME, null, 1);
this.context = context;
}
@Override
public void onOpen(SQLiteDatabase database) {
if(!database.isOpen()) {
SQLiteDatabase.openDatabase(database.getPath(), null, SQLiteDatabase.NO_LOCALIZED_COLLATORS |
SQLiteDatabase.CREATE_IF_NECESSARY);
}
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(CREATE_TABLE);
Message.message(context, "onCreate() called");
} catch (SQLException e) {
Message.message(context,e.toString());
}
}
//upgrade existing table
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
db.execSQL(DROP_TABLE);
Message.message(context, "onUpgrade() called");
onCreate(db);
} catch (SQLException e) {
Message.message(context, e.toString());
}
}
//Add a new row to db
public void addExpense (Expense expense){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_AMOUNT, expense.getAmount());
values.put(COLUMN_NOTE, expense.label);
values.put(COLUMN_CATEGORY, expense.category);
values.put(COLUMN_DATE, expense.sDate);
db.insert(TABLE_EXPENSES, null, values);
db.close();
}
//Delete Expense
public void deleteExpense (String label, double amount){
SQLiteDatabase db = getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_EXPENSES + " WHERE " + COLUMN_AMOUNT + "=" + amount + " AND " + COLUMN_NOTE + "=" + label);
}
public ArrayList<Expense> getExpenses(){
SQLiteDatabase db = this.getWritableDatabase();
ArrayList<Expense> expenses = new ArrayList<>();
// 1. build the query
String query = "SELECT * FROM " + TABLE_EXPENSES;
// 2. get reference to writable DB
onCreate(db);
Cursor cursor = db.rawQuery(query, null);
// 3. go over each row, build book and add it to list
Expense expense = null;
if (cursor.moveToFirst()) {
do {
expense = new Expense();
expense.setAmount(Double.parseDouble(cursor.getString(0)));
expense.label = (cursor.getString(1));
expense.category = Integer.parseInt(cursor.getString(2));
expense.sDate = cursor.getString(3);
// Add book to books
expenses.add(expense);
} while (cursor.moveToNext());
}
Log.d("getExpenses()", expenses.toString());
// return books
return expenses;
}
}
package com.nikhip.thecashcontroller;
导入android.content.ContentValues;
导入android.content.Context;
导入android.database.Cursor;
导入android.database.SQLException;
导入android.database.sqlite.SQLiteDatabase;
导入android.database.sqlite.SQLiteOpenHelper;
导入android.util.Log;
导入android.widget.Toast;
导入java.util.ArrayList;
公共类MyDBHandler扩展了SQLiteOpenHelper{
私人语境;
私有静态最终int数据库_VERSION=1;
私有静态最终字符串数据库\u NAME=“cashdatabase.db”;
公共静态最终字符串表\u EXPENSES=“EXPENSES”;
公共静态最终字符串列_ID=“_ID”;
公共静态最终字符串列_AMOUNT=“_AMOUNT”;
公共静态最终字符串列_NOTE=“_NOTE”;
公共静态最终字符串列_DATE=“_DATE”;
公共静态最终字符串列_CATEGORY=“_CATEGORY”;
公共数据库db1;
私有静态最终字符串CREATE_TABLE=“CREATE TABLE IF NOT EXISTS”+TABLE_EXPENSES+”(“+
列_ID+“整数主键自动递增”+
列金额+“文本”+
列注释+“文本”+
列_类别+“文本”+
列_日期+“文本”+”;“;
私有静态最终字符串DROP\u TABLE=“DROP TABLE IF EXISTS”+TABLE\u费用;
公共MyDBHandler(上下文){
super(上下文,数据库名称,null,1);
this.context=上下文;
}
@凌驾
公共void onOpen(SQLiteDatabase数据库){
如果(!database.isOpen()){
openDatabase(database.getPath(),null,SQLiteDatabase.NO\u本地化\u COLLATORS|
SQLiteDatabase.CREATE_(如果需要);
}
}
@凌驾
public void onCreate(SQLiteDatabase db){
试一试{
db.execSQL(创建_表);
Message(上下文,“onCreate()调用”);
}捕获(SQLE异常){
Message.Message(上下文,例如toString());
}
}
//升级现有表
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
试一试{
db.execSQL(DROP_TABLE);
Message.Message(上下文,“onUpgrade()被调用”);
onCreate(db);
}捕获(SQLE异常){
Message.Message(上下文,例如toString());
}
}
//向数据库中添加新行
公共无效附加费用(费用){
SQLiteDatabase db=this.getWritableDatabase();
ContentValues=新的ContentValues();
value.put(列金额,expense.getAmount());
值.put(列注释,费用.label);
价值.put(列\类别,费用.CATEGORY);
价值。投入(列_日期,费用.sDate);
db.插入(费用表,空,值
package com.nikhilp.thecashcontroller;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;
import java.util.ArrayList;
public class MyDBHandler extends SQLiteOpenHelper{
private Context context;
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "cashdatabase.db";
public static final String TABLE_EXPENSES = "expenses";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_AMOUNT = "_amount";
public static final String COLUMN_NOTE = "_note";
public static final String COLUMN_DATE = "_date";
public static final String COLUMN_CATEGORY = "_category";
public SQLiteDatabase db1;
private static final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS "+ TABLE_EXPENSES+"(" +
COLUMN_ID+ " INTEGER PRIMARY KEY AUTOINCREMENT" +
COLUMN_AMOUNT+ " TEXT " +
COLUMN_NOTE+ " TEXT " +
COLUMN_CATEGORY+ " TEXT "+
COLUMN_DATE+" TEXT" + ");";
private static final String DROP_TABLE = "DROP TABLE IF EXISTS "+TABLE_EXPENSES;
public MyDBHandler(Context context) {
super(context, DATABASE_NAME, null, 1);
this.context = context;
}
@Override
public void onOpen(SQLiteDatabase database) {
if(!database.isOpen()) {
SQLiteDatabase.openDatabase(database.getPath(), null, SQLiteDatabase.NO_LOCALIZED_COLLATORS |
SQLiteDatabase.CREATE_IF_NECESSARY);
}
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(CREATE_TABLE);
Message.message(context, "onCreate() called");
} catch (SQLException e) {
Message.message(context,e.toString());
}
}
//upgrade existing table
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
db.execSQL(DROP_TABLE);
Message.message(context, "onUpgrade() called");
onCreate(db);
} catch (SQLException e) {
Message.message(context, e.toString());
}
}
//Add a new row to db
public void addExpense (Expense expense){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_AMOUNT, expense.getAmount());
values.put(COLUMN_NOTE, expense.label);
values.put(COLUMN_CATEGORY, expense.category);
values.put(COLUMN_DATE, expense.sDate);
db.insert(TABLE_EXPENSES, null, values);
db.close();
}
//Delete Expense
public void deleteExpense (String label, double amount){
SQLiteDatabase db = getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_EXPENSES + " WHERE " + COLUMN_AMOUNT + "=" + amount + " AND " + COLUMN_NOTE + "=" + label);
}
public ArrayList<Expense> getExpenses(){
SQLiteDatabase db = this.getWritableDatabase();
ArrayList<Expense> expenses = new ArrayList<>();
// 1. build the query
String query = "SELECT * FROM " + TABLE_EXPENSES;
// 2. get reference to writable DB
onCreate(db);
Cursor cursor = db.rawQuery(query, null);
// 3. go over each row, build book and add it to list
Expense expense = null;
if (cursor.moveToFirst()) {
do {
expense = new Expense();
expense.setAmount(Double.parseDouble(cursor.getString(0)));
expense.label = (cursor.getString(1));
expense.category = Integer.parseInt(cursor.getString(2));
expense.sDate = cursor.getString(3);
// Add book to books
expenses.add(expense);
} while (cursor.moveToNext());
}
Log.d("getExpenses()", expenses.toString());
// return books
return expenses;
}
}
private static final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS "+ TABLE_EXPENSES+"(" +
COLUMN_ID+ " INTEGER PRIMARY KEY AUTOINCREMENT," +
COLUMN_AMOUNT+ " TEXT, " +
COLUMN_NOTE+ " TEXT, " +
COLUMN_CATEGORY+ " TEXT, "+
COLUMN_DATE+" TEXT" + ")";