【问题标题】:Writing to a database kills app写入数据库会杀死应用程序
【发布时间】:2012-12-25 09:56:02
【问题描述】:

我正在尝试从我的应用程序中的三个 EditText 框中获取文本输入并将它们存储到数据库中。我按照教程创建了数据库,但不确定如何查看它是否有效。我确实知道,当我点击提交按钮以发布到数据库时,我的应用程序突然根据 android 停止。

public void insertData(int name, int location, int kill){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    db.open();
    cv.put(colDeptID, 1);
    cv.put(colDeptName, "Sales");
    db.insert(deptTable, colDeptID, cv);
    cv.put(colDeptID, 2);
    cv.put(colDeptName, "IT");
    db.insert(deptTable, colDeptID, cv);
    db.close();                   

}

这是我在我的按钮的子例程中调用的子例程,以及为我的数据库中的新变量分配名称、位置和 kill。这是我的按钮按下子程序:

public void postResults(View button){
    findViewById(R.id.hunters_name);
    findViewById(R.id.location);
    findViewById(R.id.results);
    int kill = R.id.results;
    int location = R.id.location;
    int name = R.id.hunters_name;
    DatabaseHelper dbHelp = new DatabaseHelper(null);
    dbHelp.insertData(name, location, kill);

}

我不知道为什么我的应用会被杀死。

日志猫:

FATAL EXCEPTION: main
01-10 21:15:50.568: E/AndroidRuntime(973): java.lang.IllegalStateException: Could not execute method of the activity
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.view.View$1.onClick(View.java:3597)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.view.View.performClick(View.java:4202)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.view.View$PerformClick.run(View.java:17340)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.os.Handler.handleCallback(Handler.java:725)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.os.Handler.dispatchMessage(Handler.java:92)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.os.Looper.loop(Looper.java:137)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.app.ActivityThread.main(ActivityThread.java:5039)
01-10 21:15:50.568: E/AndroidRuntime(973):  at java.lang.reflect.Method.invokeNative(Native Method)
01-10 21:15:50.568: E/AndroidRuntime(973):  at java.lang.reflect.Method.invoke(Method.java:511)
01-10 21:15:50.568: E/AndroidRuntime(973):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-10 21:15:50.568: E/AndroidRuntime(973):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-10 21:15:50.568: E/AndroidRuntime(973):  at dalvik.system.NativeStart.main(Native Method)
01-10 21:15:50.568: E/AndroidRuntime(973): Caused by: java.lang.reflect.InvocationTargetException
01-10 21:15:50.568: E/AndroidRuntime(973):  at java.lang.reflect.Method.invokeNative(Native Method)
01-10 21:15:50.568: E/AndroidRuntime(973):  at java.lang.reflect.Method.invoke(Method.java:511)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.view.View$1.onClick(View.java:3592)
01-10 21:15:50.568: E/AndroidRuntime(973):  ... 11 more
01-10 21:15:50.568: E/AndroidRuntime(973): Caused by: java.lang.NullPointerException
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
01-10 21:15:50.568: E/AndroidRuntime(973):  at com.example.test.DatabaseHelper.insertData(DatabaseHelper.java:77)
01-10 21:15:50.568: E/AndroidRuntime(973):  at com.example.test.MainActivity.postResults(MainActivity.java:77)
01-10 21:15:50.568: E/AndroidRuntime(973):  ... 14 more

我看到 NullPointerException,但我不明白如何修复它。

构造函数: 公共数据库助手(上下文上下文){ 超级(上下文,dbName,null,33); }

创建: @覆盖 公共无效onCreate(SQLiteDatabase db){ // TODO 自动生成的方法存根

  db.execSQL("CREATE TABLE "+deptTable+" ("+colDeptID+ " INTEGER PRIMARY KEY , "+
    colDeptName+ " TEXT)");

  db.execSQL("CREATE TABLE "+employeeTable+" ("+colID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
        colName+" TEXT, "+colAge+" Integer, "+colDept+" INTEGER NOT NULL ,FOREIGN KEY ("+colDept+") REFERENCES"+deptTable+" ("+colDeptID+"));");


  db.execSQL("CREATE TRIGGER fk_empdept_deptid " +
    " BEFORE INSERT "+
    " ON "+employeeTable+

    " FOR EACH ROW BEGIN"+
    " SELECT CASE WHEN ((SELECT "+colDeptID+" FROM "+deptTable+"WHERE "+colDeptID+"=new."+colDept+" ) IS NULL)"+
    " THEN RAISE (ABORT,'Foreign Key Violation') END;"+
    "  END;");

  db.execSQL("CREATE VIEW "+viewEmps+
    " AS SELECT "+employeeTable+"."+colID+" AS _id,"+
    " "+employeeTable+"."+colName+","+
    " "+employeeTable+"."+colAge+","+
    " "+deptTable+"."+colDeptName+""+
    " FROM "+employeeTable+" JOIN "+deptTable+
    " ON "+employeeTable+"."+colDept+" ="+deptTable+"."+colDeptID
    );
  //Inserts pre-defined departments
 // InsertDepts(db);  
 }

【问题讨论】:

  • 您需要能够看到 Android 告诉您有关失败的信息。如果您知道如何查看日志,请执行此操作。如果您不这样做,那么下一步需要了解如何查看日志。 Android 会告诉您问题出在哪里(缺少数据库?缺少表/列?等等),但您需要知道如何找到它。

标签: java android sqlite


【解决方案1】:

您可能需要将上下文作为 DatabaseHelper 的参数。变化:

DatabaseHelper dbHelp = new DatabaseHelper(null);

为:

DatabaseHelper dbHelp = new DatabaseHelper(getApplicationContext());

如果没有帮助,请显示您在 DatabaseHelper 类中使用的构造函数、onCreate 方法和创建语句

【讨论】:

  • 显示了前两个,不确定您所说的 create 语句是什么意思。
  • 我的意思是你用来创建数据库的语句(但实际上你已经在第一篇文章中给出了 onCreate() 正文)。您是否尝试按照我的建议给出正确的上下文?
【解决方案2】:

你的方法 postResult 应该做什么?因为

findViewById(R.id.hunters_name);
findViewById(R.id.location);
findViewById(R.id.results);

什么都不做

和:

int kill = R.id.results;
int location = R.id.location;
int name = R.id.hunters_name;

给你一些类似指向这个视图的指针。

如果你的 xml 中有:

 <EditText android:id="@+id/foobar"

然后会自动在 R.id 中创建指向这个 EditText 的指针。

R.id.foobar  

只给你数值(识别正确的资源 - 你的编辑文本)

要获得此资源,您应该使用:

View v = findViewById(R.id.foobar);

如果是 EditText,你可以使用 cast:

EditText et = (EditText) findViewById(R.id.foobar) 

如果在这个editText中你有值并且想要读取这个值:

int kill = et.getText();

【讨论】:

  • 这不起作用,它给了我错误。在原始帖子中发布 logcat。
  • 告诉我它不能对原始类型 kill 执行 getText()。
  • 我忘记了类型,getText() 返回 CharSequence。试试: int foo = Integer.parseInt(et.getText().toString()); et当然是EditText
【解决方案3】:

检查您的 Logcat 输出。您可能会在其中看到 NULLPointer 异常。

$>adb logcat(是您查看日志的方式)。

【讨论】:

    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多