简体   繁体   中英

Android sqlite exception. Unable to instantiate activity

When I run an activity in my Android app with instantiating dbs classes as follows:

private final DbOpenHelper dbOpen = new DbOpenHelper(MainMonitor.this);
private final SQLiteDatabase db = dbOpen.getWritableDatabase();
private final ContentValues cv = new ContentValues();   

it falls with exception:

    07-10 15:33:31.581: E/AndroidRuntime(1142): FATAL EXCEPTION: main
07-10 15:33:31.581: E/AndroidRuntime(1142): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.android.analizer/com.android.analyzer.MainMonitor}: java.lang.NullPointerException
07-10 15:33:31.581: E/AndroidRuntime(1142):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1879)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at android.app.ActivityThread.access$600(ActivityThread.java:122)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at android.os.Looper.loop(Looper.java:137)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at android.app.ActivityThread.main(ActivityThread.java:4340)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at java.lang.reflect.Method.invokeNative(Native Method)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at java.lang.reflect.Method.invoke(Method.java:511)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at dalvik.system.NativeStart.main(Native Method)
07-10 15:33:31.581: E/AndroidRuntime(1142): Caused by: java.lang.NullPointerException
07-10 15:33:31.581: E/AndroidRuntime(1142):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at com.android.analyzer.MainMonitor.<init>(MainMonitor.java:40)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at java.lang.Class.newInstanceImpl(Native Method)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at java.lang.Class.newInstance(Class.java:1319)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
07-10 15:33:31.581: E/AndroidRuntime(1142):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1870)
07-10 15:33:31.581: E/AndroidRuntime(1142):     ... 11 more

DbOpenHelper looks like this:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class DbOpenHelper extends SQLiteOpenHelper {

    private static final String DB_NAME = "analyzer";
    private static final int DB_VERSION = 1;

    public static final String TABLE_NAME = "network";
    public static final String ACTIVITY = "activity";

    public static final String CREATE_TABLE_NETWORK = "CREATE TABLE "+TABLE_NAME+"(" +
            "_id integer primary key autoincrement, activity integer default 1)"; 

//  DbOpenHelper openHelper = null;

    public DbOpenHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
//      openHelper = new DbOpenHelper(context);

    }

    public void onCreate(SQLiteDatabase sqliteDb) {
        sqliteDb.execSQL(CREATE_TABLE_NETWORK);
        sqliteDb.execSQL("INSERT INTO network(activity) VALUES(1)");
    }

    public void onUpgrade(SQLiteDatabase sqliteDb, int i, int i2) {

    }

//  @Override
//  public void close() {
//      if (openHelper!=null) openHelper.close();       
//  }

}

The problem solved, but the next problem appeared. I've put the insert method in the DbOpenHelper class like this:

    public void onCreate(SQLiteDatabase sqliteDb) {
        sqliteDb.execSQL(CREATE_TABLE_NETWORK);
//      sqliteDb.execSQL("INSERT INTO network(activity) VALUES(1)");
        ContentValues cv = new ContentValues();
        cv.put(ACTIVITY_FIELD, 1);
        sqliteDb.insert(DbOpenHelper.TABLE_NAME, null, cv);
    }

And in Activity I'm trying to update table this way:

                    cv.put(DbOpenHelper.ACTIVITY_FIELD, 0);
//                  db.insert(DbOpenHelper.TABLE_NAME, null, cv);
                    db.update(DbOpenHelper.TABLE_NAME, cv, null, null);

An Exception is:
07-11 15:02:47.341: E/AndroidRuntime(933): FATAL EXCEPTION: main
07-11 15:02:47.341: E/AndroidRuntime(933): java.lang.NullPointerException
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:290)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:96)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1810)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1761)
07-11 15:02:47.341: E/AndroidRuntime(933):  at com.android.analyzer.MainMonitor$2.onCheckedChanged(MainMonitor.java:99)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.widget.CompoundButton.setChecked(CompoundButton.java:125)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.widget.Switch.setChecked(Switch.java:517)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.widget.Switch.animateThumbToCheckedState(Switch.java:508)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.widget.Switch.stopDrag(Switch.java:498)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.widget.Switch.onTouchEvent(Switch.java:458)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.view.View.dispatchTouchEvent(View.java:5486)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
07-11 15:02:47.341: E/AndroidRuntime(933):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1892)
07-11 15:02:47.341: E/AndroidRuntime(933):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1371)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.app.Activity.dispatchTouchEvent(Activity.java:2364)
07-11 15:02:47.341: E/AndroidRuntime(933):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1840)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.view.View.dispatchPointerEvent(View.java:5662)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2863)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.os.Looper.loop(Looper.java:137)
07-11 15:02:47.341: E/AndroidRuntime(933):  at android.app.ActivityThread.main(ActivityThread.java:4340)
07-11 15:02:47.341: E/AndroidRuntime(933):  at java.lang.reflect.Method.invokeNative(Native Method)
07-11 15:02:47.341: E/AndroidRuntime(933):  at java.lang.reflect.Method.invoke(Method.java:511)
07-11 15:02:47.341: E/AndroidRuntime(933):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-11 15:02:47.341: E/AndroidRuntime(933):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-11 15:02:47.341: E/AndroidRuntime(933):  at dalvik.system.NativeStart.main(Native Method)

I found this line helpfull -

at com.android.analyzer.MainMonitor$2.onCheckedChanged(MainMonitor.java:99)

and it seems like no table or/and row was created in dbs, that's why it couldn't update itself. What is the problem with this awefully drag-like sqlite? =)

You are getting a null pointer exception probably in the onCreate - i dont understand the INSERT INTO network(activity) - surely its just INSERT INTO network - you do insert into table name

But that is not how you are meant to do an insert either - use this example

db = this.getWriteableDatabase();
ContentValues insertValues = new ContentValues();
insertValues.put("Description", "Electricity");
insertValues.put("Amount", 500);
insertValues.put("Trans", 1);
insertValues.put("EntryDate", "04/06/2011");
db.insert("CashData", null, insertValues);

First you can check without inserting. If database is created then you can test to insert. check data folder, database is created or not.

The Activity is created only after onCreate calling. So when you are calling private final DbOpenHelper dbOpen = new DbOpenHelper(MainMonitor.this); activity still not created. Remove final modifier from your db option and init it in separate method after onCreate calling.

You should do smth like this:

public class MainMonitor extends Activity {
private DbOpenHelper dbOpen;
private SQLiteDatabase db;
private ContentValues cv;

@Override
protected void onResume() {
    super.onResume();

    initDb();
}

private void initDb() {
    dbOpen = new DbOpenHelper(MainMonitor.this);
    db = dbOpen.getWritableDatabase();
    cv = new ContentValues();
}

//....your code

}

I believe this is the line giving you trouble:

sqliteDb.execSQL("INSERT INTO network(activity) VALUES(1)");

Try,

ContentValues v = new ContentValues();
v.put(ACTIVITY, 1);
sqliteDb.insert(TABLE_NAME, null, v);

Make sure you don't insert an empty ContentValues object or else an exception will be thrown.

your error lies in this line

sqliteDb.execSQL("INSERT INTO network(activity) VALUES(1)");

since you are trying to refer to the activity column in your table, you should surround it with quotes. It should be like this

sqliteDb.execSQL("INSERT INTO network(\"activity\") VALUES(1)");

or

sqliteDb.execSQL("INSERT INTO network(" + ACTIVITY + ") VALUES(1)");

public static final String ACTIVITY = "activity";

I think you can try to change ACTIVITY field with another name. db object is null or not. change DB_VERSION value .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM