Android 此.getWritableDatabase()未调用onCreate()

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

我知道类似的问题以前也被问过很多次;但在浏览了几个小时的帖子后,我还没有找到解决办法。我的SQLite实现拒绝正常工作,并且没有创建数据库,即使我正在调用getWritableDatabase。我曾尝试卸载并重新安装该应用程序,以删除可能存在的空数据库,但没有成功。logcat中的错误如下所示:

-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" + ")";