Android 从数据库中保存和检索对象

Posted

技术标签:

【中文标题】Android 从数据库中保存和检索对象【英文标题】:Android saving and retrieving an object from a database 【发布时间】:2015-03-28 23:32:41 【问题描述】:

我创建了一个需要保存的对象,以便用户以后可以访问其中的信息。我正在使用其他问题和教程将其放入 JSONobject,然后将其转换为字符串。之后,我会将其插入到表格中...

JSONObject json = new JSONObject();
json.put("run", run);
String runString = json.toString();
SQLiteDatabase database = openOrCreateDatabase("your runs",MODE_PRIVATE,null);
database.execSQL("CREATE TABLE IF NOT EXISTS Runs(Run BLOB);");
database.execSQL("INSERT INTO Runs VALUES('"+runString+"');");

要检索它,我使用此代码...

cursor = database.rawQuery("Select * from Runs",null);
cursor.moveToFirst();
runArray = new Run[cursor.getCount()];
while(cursor.moveToNext())
    try 
            object = new JSONObject(String.valueOf(cursor.getBlob(0)));
            run = (Run) object.opt("run");
            runArray[count] = run;
            count ++;
         catch (JSONException e) 
            e.printStackTrace();
        
    

这似乎可行,但是当我尝试从 runArray 获取 Run 并获取 run 的名称时,它会导致空指针异常。 runArray 的长度为 1,应该是正确的,因为我只创建了一个 Run。这是检索运行的正确方法,还是我应该以不同的方式进行?

【问题讨论】:

我根本不会那样做。如果您只是要将数据保存为一大块 json,我什至不会打扰数据库,只需使用“SharedPreferences”即可。如果您想使用数据库,请使用带有描述数据的字段的真实结构。 是的,现在我正在尝试创建一个包含所有必要值的表。我一直在尝试将 String[] 和 float[] 插入表中。 如果您尝试插入数组,则很有可能您的数据库可以设计得更好。也许这应该是另一个表,它具有您当前正在使用的表的外键,并且数组中的每个项目都是该新表中的一行。 我明白了。我最终只是将数组转换为字符串并将它们放入桌子上的 blob 中。然后当我检索它们时,我将它们转换回数组。它现在有效。 【参考方案1】:

我想通了。而不是试图将 Run 对象放入表中。我只是将 Run 中的所有值放入表中。在检索值的另一个活动中,我获取了这些值并使用它们创建了一个新的 Run。 这是插入值的代码...

SQLiteDatabase database = openOrCreateDatabase("your runs",MODE_PRIVATE,null);
        database.execSQL("CREATE TABLE IF NOT EXISTS Runs(name VARCHAR, units VARCHAR, runtime VARCHAR, date VARCHAR, pace FLOAT, avgSpeed FLOAT, distance FLOAT, laps BLOB, speeds BLOB, distances BLOB);");
        database.execSQL("INSERT INTO Runs VALUES('"+run.getName()+"','"+run.getUnits()+"','"+run.getRunTime()+"','"+run.getDate()+"','"+run.getPace()+"','"+run.getAvgSpeed()+"','"+run.getDistance()+"','"+Arrays.toString(run.getLaps())+"','"+Arrays.toString(run.getSpeeds())+"','"+Arrays.toString(run.getDistances())+"');");

这是检索它的代码......

database = openOrCreateDatabase("your runs",MODE_PRIVATE,null);
    cursor = database.rawQuery("Select * from Runs",null);
    cursor.moveToFirst();
    runArray = new Run[cursor.getCount()];
    count = 0;
    while(!cursor.isAfterLast())
        run = new Run();
        run.setName(cursor.getString(0));
        run.setUnits(cursor.getString(1));
        run.setRunTime(cursor.getString(2));
        run.setDate(cursor.getString(3));
        run.setPace(cursor.getFloat(4));
        run.setAvgSpeed(cursor.getFloat(5));
        run.setDistance(cursor.getFloat(6));
        run.setLaps(toArray(new String(cursor.getBlob(7))));
        run.setSpeeds(toFloatArray(new String(cursor.getBlob(8))));
        run.setDistances(toFloatArray(new String(cursor.getBlob(9))));
        runArray[count] = run;
        count++;
        cursor.moveToNext();
    

我不确定这是否是最好的方法,但它现在有效。我以后可以改进它。

【讨论】:

以上是关于Android 从数据库中保存和检索对象的主要内容,如果未能解决你的问题,请参考以下文章

如何从房间数据库中的位置对象中保存和检索纬度和经度

如何保存和检索上次运行的 android 应用程序的数据?

如何从 Firebase 检索用户数据 android

如何在 Java Android App 中使用从 Webserver 检索到的 JSON 来动态创建和使用对象

从 SQLite 数据库加载的数据未保存在模型类 ArrayList android 中

将对象缓存到android(kotlin)中的文件