尝试从SQLite数据库获取数据时发生NullPointerException / CursorOutOfBoundsException

安东尼斯427

[编辑] logcat已添加

按照标题。当我尝试从数据库中恢复数据并且没有任何内容时,我曾预料会发生这种情况,因此我尝试避免这种情况。

当前,我有一个User类,它带有三个参数(String,String,int)。在扩展SQLiteOpenHelper的类中,我还具有以下方法:

public User retrieveUserInfo() {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_USER, null);


        String name = null;
        String surname = null;
        String age = null;

        if (cursor == null) {
            Log.d("NULL", "CURSOR IS NULL");
            user = new User("Please connect to server", " ", 0);

        }

        if (cursor.moveToFirst()) { 

            Log.d("NOT NULL", "CURSOR IS NOT NULL");

            do {
                name = cursor.getString(cursor.getColumnIndex(COLUMN_NAME));
                surname = cursor.getString(cursor
                        .getColumnIndex(COLUMN_SURNAME));
                age = cursor.getString(cursor.getColumnIndex(COLUMN_AGE));
            } while (cursor.moveToNext());
            Log.d("NAME", name);
            int age_p = Integer.parseInt(age);
            user = new User(name, surname, age_p);

        }



        return user;
    }

然后,我从另一个活动中调用此方法:

DatabaseTask dt = new DatabaseTask(this);
        User user = dt.retrieveUserInfo();
        String name = user.getName();
        String surname = user.getSurname();

        TextView textName = (TextView) findViewById(R.id.textView1);
        TextView textSurname = (TextView) findViewById(R.id.textView2);

        textName.setText(name);
        textSurname.setText(surname);

因此,当前我正在尝试通过在游标为null时向后发送一个带有某些占位符字段的User实例来避免崩溃(此方法中的“ user”字段是User类型的公共静态成员变量,该变量在该类的前面定义) ),并在游标不为null时返回存储在数据库中的普通数据。但是,它仍然不起作用:我卸载并重新安装该应用程序后,该应用程序崩溃了。现在,如果我在数据库中插入一些东西,然后重新安装该应用程序而没有先将其删除(我想更新它并保留旧数据库),则该应用程序不会崩溃。

关于为什么我的游标检查是否为null的任何想法都行不通?

[编辑] logcat如下:

> 03-17 02:48:35.036: E/AndroidRuntime(1225): FATAL EXCEPTION: main
> 03-17 02:48:35.036: E/AndroidRuntime(1225): Process:
> com.example.jsonbourne, PID: 1225 03-17 02:48:35.036:
> E/AndroidRuntime(1225): java.lang.RuntimeException: Unable to start
> activity
> ComponentInfo{com.example.jsonbourne/com.example.jsonbourne.MainActivity}:
> java.lang.NullPointerException 03-17 02:48:35.036:
> E/AndroidRuntime(1225):   at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
> 03-17 02:48:35.036: E/AndroidRuntime(1225):   at
> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
> 03-17 02:48:35.036: E/AndroidRuntime(1225):   at
> android.app.ActivityThread.access$800(ActivityThread.java:135) 03-17
> 02:48:35.036: E/AndroidRuntime(1225):     at
> android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
> 03-17 02:48:35.036: E/AndroidRuntime(1225):   at
> android.os.Handler.dispatchMessage(Handler.java:102) 03-17
> 02:48:35.036: E/AndroidRuntime(1225):     at
> android.os.Looper.loop(Looper.java:136) 03-17 02:48:35.036:
> E/AndroidRuntime(1225):   at
> android.app.ActivityThread.main(ActivityThread.java:5017) 03-17
> 02:48:35.036: E/AndroidRuntime(1225):     at
> java.lang.reflect.Method.invokeNative(Native Method) 03-17
> 02:48:35.036: E/AndroidRuntime(1225):     at
> java.lang.reflect.Method.invoke(Method.java:515) 03-17 02:48:35.036:
> E/AndroidRuntime(1225):   at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
> 03-17 02:48:35.036: E/AndroidRuntime(1225):   at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 03-17
> 02:48:35.036: E/AndroidRuntime(1225):     at
> dalvik.system.NativeStart.main(Native Method) 03-17 02:48:35.036:
> E/AndroidRuntime(1225): Caused by: java.lang.NullPointerException
> 03-17 02:48:35.036: E/AndroidRuntime(1225):   at
> com.example.jsonbourne.MainActivity.onCreate(MainActivity.java:31)
> 03-17 02:48:35.036: E/AndroidRuntime(1225):   at
> android.app.Activity.performCreate(Activity.java:5231) 03-17
> 02:48:35.036: E/AndroidRuntime(1225):     at
> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
> 03-17 02:48:35.036: E/AndroidRuntime(1225):   at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
> 03-17 02:48:35.036: E/AndroidRuntime(1225):   ... 11 more

[edit 2] MainActivity和activity_mail.xml如下:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //GetJson gj = new GetJson(this);
        //gj.getData();

        DatabaseTask dt = new DatabaseTask(this);

        User user = dt.retrieveUserInfo(); // **<------- LINE 31**



        String name = user.getName();
        String surname = user.getSurname();

        TextView textName = (TextView) findViewById(R.id.textView1);
        TextView textSurname = (TextView) findViewById(R.id.textView2);

        textName.setText(name);
        textSurname.setText(surname); 

        Button buttonconnect = (Button) findViewById(R.id.button_connect);

activity_mail.xml

<RelativeLayout 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=".MainActivity" >

    <Button
        android:id="@+id/button_connect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="188dp"
        android:background="#F0FF00"
        android:text="@string/pressconnect" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button_connect"
        android:layout_alignParentTop="true"
        android:layout_marginTop="100dp"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/textView1"
        android:layout_alignRight="@+id/button_connect"
        android:layout_marginRight="17dp"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_alignParentTop="true"
        android:layout_marginTop="22dp"
        android:text="Welcome,"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

有问题的代码

DatabaseTask dt = new DatabaseTask(this);

User user = dt.retrieveUserInfo(); // **<------- LINE 31**

String name = user.getName();

不能真正产生stacktrace,因此让我们通过调用getName()假设NPE确实出现在下一行null user可以通过修复retrieveUserInfo()例如以下内容来解决:

Cursor cursor = ...;

if (cursor.moveToFirst()) {
  // create user from cursor data
} else {
  // create default user
}
return user;

cursor null注释中所述,检查不是必需的。

同样,您的查询从表中获取所有行,但仅使用最后一行中的数据。稍后,您可能需要考虑优化,即仅获取您实际使用的数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试从SQLite数据库获取数据时发生NullPointerException / CursorOutOfBoundsException

来自分类Dev

插入数据库时发生NullPointerException

来自分类Dev

从数据库获取数据时,使用注解在Struts 2中调用Action时发生NullPointerException

来自分类Dev

尝试更新Access数据库时发生OleDbException

来自分类Dev

尝试创建SQL数据库时出现NullpointerException

来自分类Dev

SQLite数据库获取所有记录NullPointerException

来自分类Dev

尝试从数据库获取数据时内存耗尽(android)

来自分类Dev

从SQLite数据库获取数据时出错

来自分类Dev

尝试在android sqlite中更新数据库时出错

来自分类Dev

尝试在android sqlite中更新数据库时出错

来自分类Dev

尝试在Android中更新sqlite数据库时出错

来自分类Dev

获取可写数据库时Android中的NullPointerException

来自分类Dev

尝试从 SQLite 数据库中获取数据时,数据库助手空对象引用,没有这样的表:Offices(代码 1)

来自分类Dev

尝试获取 Firestore 数据库实例时出现 NoClassDefFoundError

来自分类Dev

SQLite数据库更新未发生

来自分类Dev

尝试从SQLite数据库填充ListView

来自分类Dev

初始化数据库适配器类时发生NullPointerException

来自分类Dev

初始化数据库适配器类时发生NullPointerException

来自分类Dev

尝试从数据库获取json数据时获取MYSQL错误代码

来自分类Dev

尝试从数据库获取json数据时获取MYSQL错误代码

来自分类Dev

尝试从数据库获取行时发生PHP分析错误-Magento

来自分类Dev

尝试从数据库检索时出错

来自分类Dev

尝试使用H2数据库更新JDBC ResultSet时发生异常

来自分类Dev

尝试保存在MySQL数据库中时发生异常

来自分类Dev

尝试使用H2数据库更新JDBC ResultSet时发生异常

来自分类Dev

尝试保存在MySQL数据库中时发生异常

来自分类Dev

pqxx:尝试连接到 posgres 数据库时发生了 Broken_connection

来自分类Dev

当我获取数据时,始终仅从sqlite数据库中获取First值

来自分类Dev

尝试使用会议室数据库时出现NullPointerException

Related 相关文章

  1. 1

    尝试从SQLite数据库获取数据时发生NullPointerException / CursorOutOfBoundsException

  2. 2

    插入数据库时发生NullPointerException

  3. 3

    从数据库获取数据时,使用注解在Struts 2中调用Action时发生NullPointerException

  4. 4

    尝试更新Access数据库时发生OleDbException

  5. 5

    尝试创建SQL数据库时出现NullpointerException

  6. 6

    SQLite数据库获取所有记录NullPointerException

  7. 7

    尝试从数据库获取数据时内存耗尽(android)

  8. 8

    从SQLite数据库获取数据时出错

  9. 9

    尝试在android sqlite中更新数据库时出错

  10. 10

    尝试在android sqlite中更新数据库时出错

  11. 11

    尝试在Android中更新sqlite数据库时出错

  12. 12

    获取可写数据库时Android中的NullPointerException

  13. 13

    尝试从 SQLite 数据库中获取数据时,数据库助手空对象引用,没有这样的表:Offices(代码 1)

  14. 14

    尝试获取 Firestore 数据库实例时出现 NoClassDefFoundError

  15. 15

    SQLite数据库更新未发生

  16. 16

    尝试从SQLite数据库填充ListView

  17. 17

    初始化数据库适配器类时发生NullPointerException

  18. 18

    初始化数据库适配器类时发生NullPointerException

  19. 19

    尝试从数据库获取json数据时获取MYSQL错误代码

  20. 20

    尝试从数据库获取json数据时获取MYSQL错误代码

  21. 21

    尝试从数据库获取行时发生PHP分析错误-Magento

  22. 22

    尝试从数据库检索时出错

  23. 23

    尝试使用H2数据库更新JDBC ResultSet时发生异常

  24. 24

    尝试保存在MySQL数据库中时发生异常

  25. 25

    尝试使用H2数据库更新JDBC ResultSet时发生异常

  26. 26

    尝试保存在MySQL数据库中时发生异常

  27. 27

    pqxx:尝试连接到 posgres 数据库时发生了 Broken_connection

  28. 28

    当我获取数据时,始终仅从sqlite数据库中获取First值

  29. 29

    尝试使用会议室数据库时出现NullPointerException

热门标签

归档