可排序的ListView上的SQLite

时间:2014-06-10 14:00:16

标签: android sqlite listview

我正在尝试基于this教程实现可排序的listView。我的数据库有以下列:

  • ID
  • NAME
  • GROUP
  • ORDER

当我在数据库中插入新数据时,我设置了NAME和GROUP列,ID是自动生成的。起初我没有在ORDER列中引入任何内容,因为我需要稍后修改此值,并且第一次不相关。

所以,在第一个活动中,我在数据库中插入了以前注释的列,然后我转到listActivity,其中将显示带有名称的listview。我可以介绍几个不同的名称,然后使用GROUP列组织它们。因此,当我想读取数据库以在listview上绑定结果时,我会查询特定的GROUP。

这里有ORDER列的功能,如果该组已经存在于数据库中,它将加载订单并按照该顺序将名称放在listview中。但如果它是一个新组,ORDER列将为空,当对listview上的项进行排序时,我将定义每个项的顺序。

我的问题:

从数据库为空的点开始,所以没有订单被建立,当我尝试查询特定的组时,起初我遇到了订单列的问题,因为它告诉该列没有存在或类似的东西。但现在,我得到了一个带有适配器构造函数的NPE,我不知道它是否与它或查询有关。

这是数据库列的投影:

String[] PROJECTION = {_ID, .NAME, GROUP, ORDER};

在这里,我阅读了一个特定的数据库组,并将其绑定在listview(以及我获得NPE的地方):

    String selection = GROUP + "=?";
    String[] selectionArgs = new String[] {group};
    String orden = ORDER + " ASC";
    try {
        cursor = getContentResolver().query(TravelOrderProvider.CONTENT_URI, PROJECTION, selection , selectionArgs , orden);
    } catch (Exception e) {}
    ListAdapter mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, null, null); //NPE HERE
    setListAdapter(mAdapter);
    cursor.close();

仍然需要检查数据库中是否存在组。

LogCat补充道:

06-10 15:52:28.473: E/AndroidRuntime(18016): FATAL EXCEPTION: main
06-10 15:52:28.473: E/AndroidRuntime(18016): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.irvvin.carpooling/com.irvvin.carpooling.SetTravelOrderActivity}: java.lang.NullPointerException
06-10 15:52:28.473: E/AndroidRuntime(18016):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2194)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2229)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at android.app.ActivityThread.access$600(ActivityThread.java:139)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1261)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at android.os.Looper.loop(Looper.java:154)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at android.app.ActivityThread.main(ActivityThread.java:4944)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at java.lang.reflect.Method.invokeNative(Native Method)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at java.lang.reflect.Method.invoke(Method.java:511)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at dalvik.system.NativeStart.main(Native Method)
06-10 15:52:28.473: E/AndroidRuntime(18016): Caused by: java.lang.NullPointerException
06-10 15:52:28.473: E/AndroidRuntime(18016):    at android.support.v4.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:312)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at android.support.v4.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:66)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at com.irvvin.carpooling.SetTravelOrderActivity.getTravelers(SetTravelOrderActivity.java:95)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at com.irvvin.carpooling.SetTravelOrderActivity.onCreate(SetTravelOrderActivity.java:51)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at android.app.Activity.performCreate(Activity.java:4531)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
06-10 15:52:28.473: E/AndroidRuntime(18016):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2150)

1 个答案:

答案 0 :(得分:2)

ListAdapter mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, null, null); //NPE HERE

而不是null, null你必须传递2个数组: 具有列名的字符串数组和具有行ID(来自布局)android.R.layout.simple_list_item_1

的int数组

示例:

 ListAdapter adapter = new SimpleCursorAdapter(this, // Context.
        android.R.layout.two_line_list_item, // Specify the row template
                            // to use (here, two
                            // columns bound to the
                            // two retrieved cursor
                            // rows).
        mCursor, // Pass in the cursor to bind to.
        // Array of cursor columns to bind to.
        new String[] { ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME },
        // Parallel array of which template objects to bind to those
        // columns.
        new int[] { android.R.id.text1, android.R.id.text2 });

来源:http://www.vogella.com/tutorials/AndroidListView/article.html#cursor