0

次のように dbs クラスをインスタンス化して Android アプリでアクティビティを実行すると、次のようになります。

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

例外があります:

    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 は次のようになります。

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();       
//  }

}

問題は解決しましたが、次の問題が発生しました。次のように DbOpenHelper クラスに挿入メソッドを配置しました。

    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);
    }

アクティビティでは、この方法でテーブルを更新しようとしています:

                    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)

この行が役立つことがわかりました-

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

dbs にテーブルや行が作成されていないようです。そのため、それ自体を更新できませんでした。このひどくドラッグのような sqlite の問題は何ですか? =)

4

6 に答える 6

1

おそらくonCreateでnullポインタ例外が発生します-INSERTINTOネットワーク(アクティビティ)を理解していません-確かにそれは単なるINSERTINTOネットワークです-テーブル名に挿入します

しかし、それはあなたが挿入を行うことを意図している方法でもありません-この例を使用してください

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);
于 2012-07-10T12:04:15.363 に答える
1

まず、挿入せずに確認できます。データベースが作成されている場合は、挿入をテストできます。データフォルダを確認してください。データベースが作成されているかどうか。

于 2012-07-10T12:05:22.003 に答える
1

は呼び出しActivity後にのみ作成されます。onCreateしたがって、アクティビティを呼び出しているときは private final DbOpenHelper dbOpen = new DbOpenHelper(MainMonitor.this); まだ作成されていません。finaldb オプションから修飾子を削除し、onCreate呼び出し後に別のメソッドで初期化します。

次のようにする必要があります。

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

}

于 2012-07-10T12:12:44.380 に答える
0

あなたのエラーはこの行にあります

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

テーブル内の列を参照しようとしているactivityので、引用符で囲む必要があります。このようになるはずです

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

また

sqliteDb.execSQL("INSERT INTO network(" + ACTIVITY + ") VALUES(1)");
于 2012-07-10T12:34:14.733 に答える
0

public static final String ACTIVITY = "アクティビティ";

ACTIVITY フィールドを別の名前に変更してみてください。db オブジェクトが null かそうでないか。DB_VERSION 値を変更します。

于 2012-07-11T10:33:00.870 に答える
0

これはあなたに問題を引き起こしている行だと思います:

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

試す、

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

空のオブジェクトを挿入しないように注意してください。そうしないContentValuesと、例外がスローされます。

于 2012-07-10T12:12:00.157 に答える