Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android从数据库中保存和检索对象_Java_Android_Database_Sqlite_Save - Fatal编程技术网

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

Java Android从数据库中保存和检索对象,java,android,database,sqlite,save,Java,Android,Database,Sqlite,Save,我已经创建了一个需要保存的对象,以便用户以后可以访问其中的信息。我使用其他问题和教程将其放入JSONobject,然后将其转换为字符串。在那之后,我会把它插入一个表中 JSONObject json = new JSONObject(); json.put("run", run); String runString = json.toString(); SQLiteDatabase database = openOrCreateDatabase("your runs",MODE_PRIVATE,

我已经创建了一个需要保存的对象,以便用户以后可以访问其中的信息。我使用其他问题和教程将其放入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获取运行,并获取运行的名称时,它会导致空指针异常。runArray的长度为1,这应该是正确的,因为我只创建了一个运行。这是检索跑步记录的正确方法,还是我应该用另一种方法来执行此操作?

我找到了答案。而不是尝试将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();
    }

我不确定这是否是最好的方法,但目前它仍然有效。我以后可以改进。

我根本不会那样做。如果您只是想将数据保存为一大块json,我甚至不想麻烦使用数据库,只需使用“SharedReferences”。如果你想使用一个数据库,使用一个真实的结构和描述数据的字段。是的,现在我正试图创建一个包含所有必要值的表。我一直在尝试向表中插入字符串[]和浮点[]。如果您尝试插入数组,则很有可能您的数据库设计得更好。也许这应该是另一个表,其中包含您当前使用的表的外键,数组中的每个项都是新表中的一行。我知道了。我最终只是将数组转换成字符串,然后将它们放到表上的blob中。然后,当我检索它们时,我将它们转换回数组。它现在起作用了。