我无法从SQLiteDatabase中删除行

时间:2013-07-27 11:36:12

标签: sqlite android-listview contextmenu

在我的代码中,当我搜索时,listview从database.i创建想要从here.i使用上下文菜单删除表。对于getter和setter,有一个Book.java文件。一切顺利,但当我按删除然后确定程序停止。我认为问题是在processDelete函数。我也无法从我的表中获取id,因为rowId是列表中的id。请快点帮帮我。没有这个,我什么也做不了。

`

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class EmployeeList extends ListActivity {

    protected EditText searchText;
    protected SQLiteDatabase db;
    protected Cursor cursor;
    protected ListAdapter adapter;
    public Integer pid=null;
    public DatabaseHelper databaseHelper=new DatabaseHelper(null);       //my database(I gave parameter null because i don't know what to give)
    public Book book;                                                    //getter setter
    private static final int DELETE_ID = Menu.FIRST+3;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        db = (new DatabaseHelper(this)).getWritableDatabase();
        searchText = (EditText) findViewById (R.id.searchText);

    }

    public void search(View view) {
        // || is the concatenation operation in SQLite
        Toast.makeText(getApplicationContext(), "insert successfull", Toast.LENGTH_LONG).show();
        cursor = db.rawQuery("SELECT _id, firstName, lastName, title FROM employee WHERE firstName || ' ' || lastName LIKE ?", 
                new String[]{"%" + searchText.getText().toString() + "%"});
adapter = new SimpleCursorAdapter(
        this, 
        R.layout.employee_list_item, 
        cursor, 
        new String[] {"firstName", "lastName", "title"}, 
        new int[] {R.id.firstName, R.id.lastName, R.id.title});
setListAdapter(adapter);
registerForContextMenu(getListView());
    }
    public void onListItemClick(ListView parent, View view, int position, long id) {
        Intent intent = new Intent(this, EmployeeDetails.class);
        Cursor cursor = (Cursor) adapter.getItem(position);
        intent.putExtra("EMPLOYEE_ID", cursor.getInt(cursor.getColumnIndex("_id"))); **strong text**
        startActivity(intent);

    }

    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenu.ContextMenuInfo menuInfo) {

menu.add(Menu.NONE, DELETE_ID, Menu.NONE, "Delete")
.setAlphabeticShortcut('d');
}

@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case DELETE_ID:
AdapterView.AdapterContextMenuInfo info=
(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();

delete(info.id);
return(true);
}

return(super.onOptionsItemSelected(item));
}
private void delete(final long rowId) {
    if (rowId>0) {
      new AlertDialog.Builder(this)
        .setTitle(R.string.delete_title)
        .setPositiveButton(R.string.ok,
                            new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog,
                                int whichButton) {

            processDelete(rowId);
          }
        })
        .setNegativeButton(R.string.cancel,
                            new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog,
                                int whichButton) {
          // ignore, just dismiss
          }
        })
        .show();
    }
  }
private void processDelete(long rowId) {                           //I get exact rowid.
    String[] args={String.valueOf(rowId)};    

    databaseHelper.getWritableDatabase().delete("employee", "_ID=?", args); //employee is table name and _ID is id column(here i get nullPointerException)
    cursor.requery();
  }
}`

数据库助手类:

` 公共类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。我的删除查询中有什么问题吗?

logcat的:

`

07-28 20:10:23.384: E/AndroidRuntime(977): FATAL EXCEPTION: main
07-28 20:10:23.384: E/AndroidRuntime(977): java.lang.NullPointerException
07-28 20:10:23.384: E/AndroidRuntime(977):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
07-28 20:10:23.384: E/AndroidRuntime(977):  at com.example.intent.EmployeeList.processDelete(EmployeeList.java:124)
07-28 20:10:23.384: E/AndroidRuntime(977):  at com.example.intent.EmployeeList.access$0(EmployeeList.java:115)
07-28 20:10:23.384: E/AndroidRuntime(977):  at com.example.intent.EmployeeList$1.onClick(EmployeeList.java:101)
07-28 20:10:23.384: E/AndroidRuntime(977):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158)
07-28 20:10:23.384: E/AndroidRuntime(977):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-28 20:10:23.384: E/AndroidRuntime(977):  at android.os.Looper.loop(Looper.java:123)
07-28 20:10:23.384: E/AndroidRuntime(977):  at android.app.ActivityThread.main(ActivityThread.java:4627)
07-28 20:10:23.384: E/AndroidRuntime(977):  at java.lang.reflect.Method.invokeNative(Native Method)
07-28 20:10:23.384: E/AndroidRuntime(977):  at java.lang.reflect.Method.invoke(Method.java:521)
07-28 20:10:23.384: E/AndroidRuntime(977):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-28 20:10:23.384: E/AndroidRuntime(977):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-28 20:10:23.384: E/AndroidRuntime(977):  at dalvik.system.NativeStart.main(Native Method)

`

通过插入这些来解决这些问题。但仍有一些错误。

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)

我将如何解决光标问题?

1 个答案:

答案 0 :(得分:1)

创建数据库助手时,请调用

public DatabaseHelper databaseHelper=new DatabaseHelper(null);

null错了。如果您查看有关Context的文档,您会看到Activity是已知的间接子类。您当前的活动是此处的上下文:

public DatabaseHelper databaseHelper=new DatabaseHelper(this);

修改

作为构造函数定义

public DatabaseHelper(Context context)

告诉我,创建Context需要DatabaseHelper类型的参数。 Context对象提供有关特定应用程序的信息,并提供与应用程序相关的服务。

可以使用类似于例如子类的Context对象而不是ListActivityListActivity。在文档中,您可以看到Activity扩展ContextThemeWrapper,后者又扩展Context,依此扩展到Context。在需要EmployeeList对象作为参数的情况下,可以使用其中一个类的每个对象(至少在形式上,根据用例,可能存在在实践中不起作用的对象)。

您的ListActivity扩展this,因此也可以用作上下文。方法中的关键字obj.foo() 始终引用调用方法的对象,例如,在电话中

this
foo()中的

obj则表示this引用的同一个对象。

在开头的特定情况下,EmployeeList引用{{1}}对象。