Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我无法从SQLITE数据库中删除行_Sqlite_Android Listview_Contextmenu - Fatal编程技术网

我无法从SQLITE数据库中删除行

我无法从SQLITE数据库中删除行,sqlite,android-listview,contextmenu,Sqlite,Android Listview,Contextmenu,在我的代码中,当我搜索时,会从数据库中创建一个listview。我想从这里删除表中的行。我使用了上下文菜单。有一个用于getter和setter的Book.java文件。一切正常,但当我按delete然后单击ok时,程序停止。我认为问题出在processDelete函数中。我也无法从表中获取id,因为rowId是列表中的id。请快帮帮我,没有这个我什么都做不了 ` 数据库帮助程序类: ` 公共类DatabaseHelper扩展了SQLiteOpenHelper{ public static

在我的代码中,当我搜索时,会从数据库中创建一个listview。我想从这里删除表中的行。我使用了上下文菜单。有一个用于getter和setter的Book.java文件。一切正常,但当我按delete然后单击ok时,程序停止。我认为问题出在processDelete函数中。我也无法从表中获取id,因为rowId是列表中的id。请快帮帮我,没有这个我什么都做不了

`

数据库帮助程序类:

` 公共类DatabaseHelper扩展了SQLiteOpenHelper{

  public static final String DB_NAME = "employee_directory"; 
    public static final Integer VERSION=1;

    public static final String TABLE_NAME= "employee";
    public static final String _id= "id";
    public static final String firstName= "firstName";
    public static final String lastName= "lastName";
    public static final String title= "title";
    public static final String officePhone= "officePhone";
    public static final String cellPhone= "cellPhone";
    public static final String email= "email";

    public static final String TABLE_SQL = "CREATE TABLE " + TABLE_NAME+" (" +_id+" INTEGER PRIMARY KEY AUTOINCREMENT, " 
    + firstName+ " TEXT, " + lastName+ " TEXT, " + title+ " TEXT, " + officePhone+ " TEXT, " + cellPhone+" TEXT, " + email+" TEXT)";
    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        Log.d("TABLE SQL", TABLE_SQL);
        db.execSQL(TABLE_SQL);

            }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldV, int newV) {
    db.execSQL("DROP TABLE IF EXISTS employees");
    onCreate(db);
}
//  public void delete(int pos) {
   //     SQLiteDatabase db = this.getWritableDatabase();
    //    db.delete(TABLE_NAME, _id + " = ?",
     //           new String[] { String.valueOf(pos)});
      //  db.close();
 //   }

    //public void delete(String value1) {
        // TODO Auto-generated method stub

    //  getWritableDatabase().delete(TABLE_NAME, "id=?", new String[] { value1 });  

    //}
}`

Logcat说我得到了NullPointerException。我的删除查询有什么问题吗

日志:

`

通过插入此项可以解决这些问题,但仍然存在一些错误

08-09 02:09:52.955: E/Database(310): close() was never explicitly called on database '/data/data/com.example.intent/databases/employee_directory' 
08-09 02:09:52.955: E/Database(310): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
08-09 02:09:52.955: E/Database(310):    at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1810)
08-09 02:09:52.955: E/Database(310):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
08-09 02:09:52.955: E/Database(310):    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
08-09 02:09:52.955: E/Database(310):    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
08-09 02:09:52.955: E/Database(310):    at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
08-09 02:09:52.955: E/Database(310):    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
08-09 02:09:52.955: E/Database(310):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
08-09 02:09:52.955: E/Database(310):    at com.example.intent.EmployeeList.onCreate(EmployeeList.java:44)
08-09 02:09:52.955: E/Database(310):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-09 02:09:52.955: E/Database(310):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-09 02:09:52.955: E/Database(310):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-09 02:09:52.955: E/Database(310):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-09 02:09:52.955: E/Database(310):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-09 02:09:52.955: E/Database(310):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-09 02:09:52.955: E/Database(310):    at android.os.Looper.loop(Looper.java:123)
08-09 02:09:52.955: E/Database(310):    at android.app.ActivityThread.main(ActivityThread.java:4627)
08-09 02:09:52.955: E/Database(310):    at java.lang.reflect.Method.invokeNative(Native Method)
08-09 02:09:52.955: E/Database(310):    at java.lang.reflect.Method.invoke(Method.java:521)
08-09 02:09:52.955: E/Database(310):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-09 02:09:52.955: E/Database(310):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-09 02:09:52.955: E/Database(310):    at dalvik.system.NativeStart.main(Native Method)
08-09 02:09:52.955:E/Database(310):从未对数据库“/data/data/com.example.intent/databases/employee_目录”显式调用close()
08-09 02:09:52.955:E/Database(310):android.Database.sqlite.DatabaseObjectNotClosedException:应用程序未关闭在此打开的游标或数据库对象
08-09 02:09:52.955:E/Database(310):位于android.Database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1810)
08-09 02:09:52.955:E/Database(310):位于android.Database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
08-09 02:09:52.955:E/Database(310):位于android.Database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
08-09 02:09:52.955:E/Database(310):位于android.Database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
08-09 02:09:52.955:E/Database(310):位于android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
08-09 02:09:52.955:E/Database(310):位于android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
08-09 02:09:52.955:E/Database(310):位于android.Database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
08-09 02:09:52.955:E/Database(310):位于com.example.intent.EmployeeList.onCreate(EmployeeList.java:44)
08-09 02:09:52.955:E/Database(310):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-09 02:09:52.955:E/数据库(310):位于android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-09 02:09:52.955:E/数据库(310):位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-09 02:09:52.955:E/数据库(310):位于android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-09 02:09:52.955:E/Database(310):位于android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-09 02:09:52.955:E/Database(310):位于android.os.Handler.dispatchMessage(Handler.java:99)
08-09 02:09:52.955:E/Database(310):位于android.os.Looper.loop(Looper.java:123)
08-09 02:09:52.955:E/数据库(310):位于android.app.ActivityThread.main(ActivityThread.java:4627)
08-09 02:09:52.955:E/Database(310):位于java.lang.reflect.Method.Invokenactive(本机方法)
08-09 02:09:52.955:E/Database(310):位于java.lang.reflect.Method.invoke(Method.java:521)
08-09 02:09:52.955:E/Database(310):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-09 02:09:52.955:E/Database(310):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-09 02:09:52.955:E/数据库(310):位于dalvik.system.NativeStart.main(本机方法)

如何解决光标问题?

创建数据库帮助程序时,调用

public DatabaseHelper databaseHelper=new DatabaseHelper(null);
但是
null
是错误的。如果查看有关
上下文的文档
,您会发现例如
活动
是一个已知的间接子类。您当前的活动是此处的上下文:

public DatabaseHelper databaseHelper=new DatabaseHelper(this);
编辑:

作为构造函数定义

public DatabaseHelper(Context context)
说明,创建
数据库助手
需要
上下文
类型的参数。
上下文
对象提供有关特定应用程序的信息,并提供与应用程序相关的服务

可以使用子类的对象来代替
上下文
,例如
ListActivity
。在文档中,您可以看到
ListActivity
扩展了
Activity
,而后者又扩展了
ContextThemeWrapper
,依此类推,一直扩展到
Context
。其中一个类的每个对象都可以在需要
上下文
对象作为参数的情况下使用(至少在形式上,取决于用例,可能存在实际不起作用的对象)

您的
EmployeeList
扩展了
ListActivity
,因此也可以用作上下文。方法中的关键字
this
总是指调用方法的对象,例如在调用中

obj.foo()
这个
foo()
中的
意味着与
obj
所指的对象相同


在开头的特定情况下,
引用一个
员工列表
对象。

在创建数据库帮助程序时,调用

public DatabaseHelper databaseHelper=new DatabaseHelper(null);
但是
null
是错误的。如果查看有关
上下文的文档
,您会发现例如
活动
是一个已知的间接子类。您当前的活动是此处的上下文:

public DatabaseHelper databaseHelper=new DatabaseHelper(this);
编辑:

作为构造函数定义

public DatabaseHelper(Context context)
说明,创建
数据库助手
需要
上下文
类型的参数。
上下文
对象提供有关特定应用程序的信息,并提供与应用程序相关的服务

可以使用子类的对象来代替
上下文
,例如
ListActivity
。在文档中,您可以看到
ListActivity
扩展了
Activity
,而后者又扩展了
ContextThemeWrapper
,依此类推,一直扩展到
Context
。其中一个类的每个对象都可以在需要
上下文
对象作为参数的情况下使用(至少在形式上,取决于可能存在对象的用例)