当前位置: 首页 > 知识库问答 >
问题:

SQLite数据库不保存数据为什么不工作[重复]

东郭勇
2023-03-14

我正在创建一个Android应用程序,将数据保存在SQLite数据库中,然后从同一个数据库读取数据。这样一来,我就不需要每次将数据联机到MySQL服务器。我将其连接到一个外部数据库,提取数据,并尝试查看数据是否正在保存,但当我尝试使用函数getAllMonths从SQLite数据库获取数据时,它似乎是空的


public class DatabaseHelper extends SQLiteOpenHelper {

    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "pm";


    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE consommation( date TEXT UNIQUE, conso_eau NUMERIC , conso_elec NUMERIC )");
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS consommation");

        // Create tables again
        onCreate(db);
    }

    public void insertMonth(String date, double conso_eau, double conso_elec) {
        // get writable database as we want to write data
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        // `id` and `timestamp` will be inserted automatically.
        // no need to add them
        values.put("date", date);
        values.put("conso_eau", conso_eau);
      //  values.put("prix_eau", prix_eau);
        values.put("conso_elec", conso_elec);
       // values.put("prix_elec", prix_elec);
        // insert row
        db.insert("consommation", null, values);

        // close db connection
        db.close();

    }

    public ArrayList<Month> getAllMonths() {
        ArrayList<Month> months = new ArrayList<>();

        // Select All Query
        String selectQuery = "SELECT  * FROM consommation ORDER BY date DESC";

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

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                Month m = new Month(cursor.getString(0), cursor.getFloat(1),cursor.getFloat(3));
                months.add(m);
            } while (cursor.moveToNext());
        }

        // close db connection
        db.close();

        // return notes list
        return months;
    }

    public void deleteAll() {
        SQLiteDatabase db = this.getWritableDatabase();
        db.execSQL("delete from consommation");
        db.close();
    }
}

对于获取数据的类,数据会保存下来,当我试图检查它时,它会告诉我它是空的


public class historique extends AppCompatActivity {
    private String idc;
    private DatabaseHelper db;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


       if (idc != null) {
            if (!SharedPrefManager.getInstance(getApplicationContext()).getHisto()) {
                db.deleteAll();
                getthingy();


           }

        } else {
            Intent intent = new Intent(historique.this, LoginActivity.class);
            startActivity(intent);
            finish();
        }
    }

    public void getthingy() {

        String url = "http://192.168.1.3/pm/historique.php?con=%1$s";
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Loading...");
        progressDialog.show();
        RequestQueue queue = Volley.newRequestQueue(this);
        String uri = String.format(url, 1);
        JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, uri, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            if (response.getString("status").equals("success")) {

                                JSONObject dataResult = response.getJSONObject("result");
                                JSONArray jArr = (JSONArray) dataResult.getJSONArray("data");
                                Log.d("hani",jArr+"working...");
                                JSONArray innerObj;
                                for(int i = 0; i < jArr.length();i++) {
                                    innerObj = jArr.getJSONArray(i);
                                    Log.d("hani","working...");
                                    db.insertMonth(innerObj.getString(0), innerObj.getDouble(1),innerObj.getDouble(2));

                                }

                               SharedPrefManager.getInstance(getApplicationContext()).setHisto(true);


                                progressDialog.hide();

                            } else {
                                Toast.makeText(getApplicationContext(), response.getString("result"), Toast.LENGTH_SHORT).show();
                                progressDialog.hide();
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.d("Error.Response", error.getMessage());
                    }
                }
        );


        // Add the request to the RequestQueue.
        queue.add(getRequest);
    }

}

所以我为测试添加了这个函数,并将其命名为Oncreate()

public void getdat()
    {
        ArrayList<Month> months = new ArrayList<>();
        months=db.getAllMonths();
        double tmp[] = new double[0];
        int i =0 ;
        ArrayList<BarEntry> datavals= new ArrayList<>();
        for(Month dat : months)
        {
            tmp[i] = dat.getConso_eau();
            Log.d("test_db",""+tmp[i]);
        }

    }

我得到了这个错误

2019-06-07 08:30:53.577 7259-7259/com.example.pm_hs E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.pm_hs, PID: 7259
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pm_hs/com.example.pm_hs.historique}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.ArrayList com.example.pm_hs.DatabaseHelper.getAllMonths()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.ArrayList com.example.pm_hs.DatabaseHelper.getAllMonths()' on a null object reference
        at com.example.pm_hs.historique.getdat(historique.java:106)
        at com.example.pm_hs.historique.onCreate(historique.java:47)
        at android.app.Activity.performCreate(Activity.java:6975)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6541) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

Mysql部分似乎工作正常,因为我用postman对其进行了测试,甚至日志语句都显示它们是从Mysql数据库中正确提取的

如果有人能引导我走过正确的道路,因为我是
的新手,请提前谢谢你

共有1个答案

尹凌龙
2023-03-14

我相信您的问题是您没有实例化您的Database aseHelper db,您只是使用

private DatabaseHelper db;

您需要使用

db = new DatabseHelper(this);

这应该在历史记录活动的onCreate方法中完成。

e、 g:-

public class historique extends AppCompatActivity {
    private String idc;
    private DatabaseHelper db;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        db = new DatabseHelper(this); //<<<<<<<<<<

        ........ rest of the code

然而,考虑到逻辑,getThinggy方法永远不会被调用,因为字符串变量idc在声明idc时总是为null,但从未实例化/设置。因此,在以下情况下,只有else子句中的代码将运行,即活动将始终启动LoginActivity:-

   if (idc != null) {
        if (!SharedPrefManager.getInstance(getApplicationContext()).getHisto()) {
            db.deleteAll();
            getthingy();
       }

    } else {
        Intent intent = new Intent(historique.this, LoginActivity.class);
        startActivity(intent);
        finish();
    }

空指针异常是由于db根据答案的第一部分为空。您需要根据本答案的第一部分再次实例化db。

信息

Attempt to invoke virtual method 'java.util.ArrayList com.example.pm_hs.DatabaseHelper.getAllMonths()' on a null object reference

表示无法调用getAllMonths方法,因为指向该方法(根据您提供的代码,DatabaseHelper对象db)的指针为null。

 类似资料:
  • 我想从sqlite数据库添加的数据中在listview中显示我的所有数据。当我单击save按钮时,它显示一条消息“added successful”。但每次它都显示错误消息“data not found”。为什么不显示listview? 错误显示如下: MyDatabaseHelper.java

  • 问题内容: 即时通讯试图将我的用户使用网络表单输入的长文本(约2500个字符)保存到我的数据库中,并使用php传递给服务器。 当我在phpmyadmin中查看时,文本会变大。如何配置表格以获得完整的文本?这是我的表配置: 看一看具有3000个字符限制的字段 内容 ,但是文本总是以 690个字符为准 。谢谢你的帮助! 编辑 :我发现了问题,但我不知道如何解决。查询总是以相同的char形式获取农作物,

  • 我在通过log4net记录到数据库时遇到问题。 < li >用户有权插入数据库 < li >相同的insert语句在Management Studio中有效 < li>log4net确实记录到文件,但不记录到数据库 < li >连接字符串正确(在其他应用程序中相同) 获得了以下配置: 数据库中的两列是: 消息varchar(max)不为空。 级别varchar(50)不为空 谢谢

  • 我的表单已提交,但未存储在表中。如果我对请求执行dd(),则数据在中,但当我执行save()时,它不会按预期工作。我想在backoffice表单上添加用户,仅包含姓名、电子邮件、用户类型和密码。 编辑:我将问题图像更改为代码,以便您更容易理解,很抱歉第一次尝试。编辑2:现在出现了更多的两件事,密码验证确认总是错误的,如果我跳过验证,则会出现以下错误: 对未定义方法App\User::forget(

  • 为什么我的值不能进入数据库? 如果需要更多的代码,请告诉我。 警告: 查询连接中的异常。php第713行:SQLSTATE[23000]:完整性约束冲突:1048列“name”不能为空(SQL:insert-into(,,,,)值(,,2016-06-19 21:44:05,2016-06-19 21:44:05)) 控制器: HTML页面:

  • 我正在为我的大学创建一个Android项目,在那里我想用移动指纹传感器制作像指纹考勤系统这样的东西,所以实际上我想把生物特征数据保存到数据库中,以便在考勤时进一步参考。我想将指纹数据保存到移动指纹传感器SQL数据库中。