2013-05-08 97 views
0

我很新的android(和编程),所以我希望这个问题不是太愚蠢。我试图通过教程来回答我的问题,并通过搜索通过stackoverflow没有成功。Android:从列表视图中删除SQLite项目。 NullPointerException

我想填充一个SQLite数据库列表:当我点击列表上的一个项目时,我希望它从列表视图和数据库中删除。通过调试,我认为问题出在我的ArrayAdapter方法上,因为即使像“getCount()”这样的基本方法似乎也不产生输出。

对于我的SQLite数据库处理器类,这里是获取数据库中的所有项目和删除项目的方法:

  // Getting All breadcrumbs 
    public List<Breadcrumb> getAllBreadcrumbs() { 
    List<Breadcrumb> breadcrumbList = new ArrayList<Breadcrumb>(); 
     // Select All Query 
     String selectQuery = "SELECT * FROM " + TABLE_BREADCRUMBS; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      Breadcrumb breadcrumb = new Breadcrumb(); 
      breadcrumb.setId(Integer.parseInt(cursor.getString(0))); 
      breadcrumb.setBreadcrumbLatitude(cursor.getInt(1)); 
      breadcrumb.setBreadcrumbLongitude(cursor.getInt(2)); 
      // Adding location to list 
      breadcrumbList.add(breadcrumb); 
     } while (cursor.moveToNext()); 
    } 

    // Deleting single breadcrumb 
     public void deleteBreadcrumb(Breadcrumb breadcrumb) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     int id = breadcrumb.getId(); 
     System.out.println("Comment deleted with id: " + id); 
     db.delete(TABLE_BREADCRUMBS, KEY_ID 
       + " = " + id, null); 
     db.close(); 
      } 

的麻烦活动的XML布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".CollectedBreadcrumbsActivity" > 

<ListView 
    android:id="@+id/list" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 
</ListView> 

</LinearLayout> 

这里是活动:

public class CollectedBreadcrumbsActivity extends Activity implements OnItemClickListener { 

private ListView listview; 
private DatabaseHandler db; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_collected_breadcrumbs); 

    DatabaseHandler db = new DatabaseHandler(this); 
    List<Breadcrumb> breadcrumbs = db.getAllBreadcrumbs(); 

    listview = (ListView) findViewById(R.id.list); 
    ArrayAdapter<Breadcrumb> adapter = new ArrayAdapter<Breadcrumb>(this, 
      android.R.layout.simple_list_item_1, breadcrumbs); 
     listview.setAdapter(adapter); 
    listview.setOnItemClickListener(this); 
} 

public void onItemClick(AdapterView<?> l, View v, int position, long id) { 
    Log.d("HelloListView", "You clicked Item: " + id + " at position:" + position); 
    Log.d("HelloListView", "Number of items in adapter:" + listview.getAdapter().getCount()); 
    @SuppressWarnings("unchecked") 
    ArrayAdapter<Breadcrumb> adapter = (ArrayAdapter<Breadcrumb>) listview.getAdapter(); 
    if (listview.getAdapter().getCount() > 0) { 
     Breadcrumb breadcrumb = (Breadcrumb) listview.getAdapter().getItem(position); 
     db.deleteBreadcrumb(breadcrumb); 
     adapter.remove(breadcrumb); 
     } 
    adapter.notifyDataSetChanged(); 
    } 
} 

该listview显示出来好吗,但是wh恩我单击列表中的项目,应用程序崩溃与以下日志:

05-07 19:08:40.671: D/HelloListView(29562): You clicked Item: 5 at position:5 
05-07 19:08:40.671: W/dalvikvm(29562): threadid=1: thread exiting with uncaught exception (group=0x40e4c438) 
05-07 19:08:40.671: E/AndroidRuntime(29562): FATAL EXCEPTION: main 
05-07 19:08:40.671: E/AndroidRuntime(29562): java.lang.NullPointerException 
05-07 19:08:40.671: E/AndroidRuntime(29562): at com.detimil.breadcrumbs1.CollectedBreadcrumbsActivity.onItemClick(CollectedBreadcrumbsActivity.java:42) 
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.widget.AbsListView.performItemClick(AbsListView.java:1268) 
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.widget.AbsListView$PerformClick.run(AbsListView.java:3059) 
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.widget.AbsListView$1.run(AbsListView.java:3950) 
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.os.Handler.handleCallback(Handler.java:615) 
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.os.Looper.loop(Looper.java:137) 
05-07 19:08:40.671: E/AndroidRuntime(29562): at android.app.ActivityThread.main(ActivityThread.java:4950) 
05-07 19:08:40.671: E/AndroidRuntime(29562): at java.lang.reflect.Method.invokeNative(Native Method) 
05-07 19:08:40.671: E/AndroidRuntime(29562): at java.lang.reflect.Method.invoke(Method.java:511) 
05-07 19:08:40.671: E/AndroidRuntime(29562): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
05-07 19:08:40.671: E/AndroidRuntime(29562): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 
05-07 19:08:40.671: E/AndroidRuntime(29562): at dalvik.system.NativeStart.main(Native Method) 

同样,我认为这个问题必须与我的ArrayAdapter,因为即使该日志Log.d("HelloListView", "Number of items in adapter:" + listview.getAdapter().getCount());不会产生应用程序崩溃的事情之前。

如果有人对此有任何想法,我会非常感谢帮助。再次,如果这是一个愚蠢的问题,很抱歉。

非常感谢。

回答

4

dbnull

因为

DatabaseHandler db = new DatabaseHandler(this); 

它会创建一个本地实例,但不实例db场 所以要像这样

db = new DatabaseHandler(this); 
+0

@peopletrees,只是删除 '数据库处理器',从数据库处理器DB =新的数据库处理器(本);并接受由pragnani – umesh 2013-05-08 05:45:40

+0

在私人DatabaseHandler数据库中的答案;你只是创建引用,而不是对象,你创建的对象只是onCreate的本地对象,所以对象将在创建之外为空 – umesh 2013-05-08 05:48:10

+0

@peopletrees Pragnani是对的。他只是没有解释得很好。你在'CollectedBreadCrumbsActivity'中有一个'DatabaseHelpern'类型的私有类成员'db'。在'onCreate()'里面,你声明一个局部变量'db',也是类型'DatabaseHelper'。您可以使用'CollectedBreadCrumbsActivity.this.db'来引用类级别'db'成员来解决Java中的这种歧义。然而,我们假设你并不是想要创建一个db的本地实例,然后把它扔掉,而你的意思是相当于初始化db级别的成员。按照Pragnani的建议,将会解决这个问题。 – dcow 2013-05-08 05:49:15

0

您的数据库应全球不在本地启动。

我想补充一点,总体来说使用ArrayAdapter从数据库加载并不是一个好主意。您应该使用CursorAdapter和CursorLoader来管理数据库。

这里的自定义CursorAdapter的一个很好的教程:link

另一个用于CursorLoaders:link

相关问题