SQLite Android中未显示数据库表[重复]

Posted

技术标签:

【中文标题】SQLite Android中未显示数据库表[重复]【英文标题】:Database table is not showing in SQLite Android [duplicate] 【发布时间】:2017-03-08 11:04:49 【问题描述】:

这里我做的是Database Cursor的功能,是项目中经常用到的。

这是我在 DAL 中的代码:

public Cursor SelectQuery(String table)
  Cursor cursor=SQLiteDb.query(table,null,null,null,null,null,null,null);
  return cursor;

通过调试 SQLiteDB 在 mainactivity 中为空

代码:

Cursor c=dal.SelectQuery(ConstantsValues.TabData);
Log.e("hello111",""+c.getCount());

为了获得总行数但是表没有出现。这里 ConstantsValues.TabData 有表名。 在这里的代码中:

public ArrayList AllSelectQryForTabEmpData1() 
  ArrayList<Employee> data = new ArrayList();

  Cursor cursor = SQLiteDb.query(ConstantsValues.TabData, null, null, null, null, null, null, null);
  while (cursor.moveToNext()) 
    String id = cursor.getString(cursor.getColumnIndex(ConstantsValues.ID));
    String name = cursor.getString(cursor.getColumnIndex(ConstantsValues.NAME));
    String value= cursor.getString(cursor.getColumnIndex(ConstantsValues.VALUE));

    data.add(new Employee(id, name,value));
  
  cursor.close();
  return data;

这里是打开和关闭代码:

public void OpenDB() 
  SQLiteDb = new DBHelper(context).getWritableDatabase();


public void CloseDB() 
  if (SQLiteDb.isOpen()) 
     SQLiteDb.close();
  

我在 SQLiteDb 中获取表。制作Cursor好像有问题。

这是我的logcat

E/androidRuntime: FATAL EXCEPTION: main
                                                                             Process: com.example.abhishek.httpclient, PID: 12538
                                                                             java.lang.RuntimeException: Unable to start activity ComponentInfocom.example.abhishek.httpclient/com.example.abhishek.httpclient.MainActivity: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String)' on a null object reference
                                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2671)
                                                                                 at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1501)
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:111)
                                                                                 at android.os.Looper.loop(Looper.java:207)
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:5769)
                                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:681)
                                                                              Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String)' on a null object reference
                                                                                 at com.example.abhishek.httpclient.DAL.SelectQuery(DAL.java:141)
                                                                                 at com.example.abhishek.httpclient.MainActivity.onCreate(MainActivity.java:92)
                                                                                 at android.app.Activity.performCreate(Activity.java:6317)
                                                                                 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136)
                                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2532)
                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2671) 
                                                                                 at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1501) 
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:111) 
                                                                                 at android.os.Looper.loop(Looper.java:207) 
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:5769) 
                                                                                 at java.lang.reflect.Method.invoke(Native Method) 
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:681) 

【问题讨论】:

已编辑...我的问题 SQLiteDb 为空,所以正确初始化它 能不能初始化一段演示代码让我看懂... 原因:java.lang.NullPointerException,db为null? 是的...@DonaldWu 【参考方案1】:

您需要先实例化 SQLiteDatabase,如下所示:

// Create and/or open the database for writing
SQLiteDatabase db = getWritableDatabase();

更新:

对于一个简单的修复,您可以将您的 openDB() 方法更改为(注意:未测试):

public void openDB() 
  if(sqliteDB == null) 
    sqliteDB= new DBHelper(context).getWritableDatabase();
   else 
    if(!sqliteDB.isOpen()
       // reopen again. 
       // NOTE: This should be changed to the method which you use to open the db.
       sqliteDB= new DBHelper(context).getWritableDatabase();
    
  

然后在每次使用 SQLiteDb 时调用它,如下所示:

openDB();
Cursor cursor = SQLiteDb.query(ConstantsValues.TabData, null, null,
                                null, null, null, null, null);
...

【讨论】:

【参考方案2】:

我认为数据库连接有问题。请特别关注本教程 DBHelper.java 类。他们如何建立数据库连接。 https://www.tutorialspoint.com/android/android_sqlite_database.htm

SQLiteDatabase db = this.getWritableDatabase();

通过使用 getWritableDatabase(),您可以对数据库进行读写操作。

【讨论】:

好吧,我在 AllSelectQryForTabEmpData1() 中的其他代码工作正常.....但不是这个我会尝试 我认为,这些代码 sn-p 取自两个不同的 java 类。可能是,在一个你已经创建了连接,但在另一个没有。 @Abhi 是的,我刚刚在其他 java 类中初始化了它...**arr_emp** = ban.AllSelectQryForTabEmpData1(); 请确保您在使用 SQLiteDB 之前已建立连接。如果需要,再次调用 openDb() 方法。 你是对的 谢谢 :) 1 票赞成.. :)

以上是关于SQLite Android中未显示数据库表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android Xamarin-使用SQLite时打开计划的通知会停止重复并崩溃

如何从数据库中检索所有表? (Android,SQLite)[重复]

如何从 sqlite DB 中列出表名——Android [重复]

Android Studios:Android 设备管理器在文件资源管理器中未显示 Nougat 7.0 的文件

如何使用列表视图在选项卡式活动的片段中呈现 SQLite 表数据 [重复]

Scrapy - SQLite 中未创建 SQLalchemy 外键