如何将Json数据存储到Sqlite中?

5

你好,我正在开发一个应用程序,想要从手机向服务器发送数据。但问题在于,只有当服务器在线/启动时,网站上才会反映数据。当服务器离线时,我得到的响应是400或502,因此数据仅显示在手机屏幕上,而不会反映在服务器上。因此,我想创建Sqlite数据库,这样当我进行读取时,数据就会存储在数据库中,并且想要上传数据时,服务器变为在线。我想将这个任务插入到Sqlite中,但由于我是Android新手,不知道如何将这个JSON插入到Sqlite中,请帮帮我。谢谢。

            JSONObject json = new JSONObject();
            json.put("siteId", "");
            if (wtConnected == true) {
                json.put("patientId", 15);
                json.put("deviceMACId", DeviceMac);
                json.put("readingType", 1003);
                json.put("deviceData", weight);
                json.put("deviceType", "WeightScale");

            } else if (bpConnected == true) {
                json.put("patientId", 5);

                json.put("deviceMACId", DeviceMac);
                json.put("readingType", 1002);
                json.put("deviceData", bpdata);
                json.put("deviceType", "BPMonitor");

            } 
            json.put("assetId", "");
            json.put("geoLocationLatitude", "");
            json.put("clientId", "");
            json.put("timeStamp", System.currentTimeMillis());
            json.put("deviceRawData", "");
            json.put("geoLocationLongitude", "");
            System.out.println("Json Is:" + json);
6个回答

2

我的朋友刚刚做了以下的事:

  1. Define this class which will perform all the operation related to your database creation and manipulation and make changes in this class according to your need.

    DatabaseHandler.java
    
    
    
     public class DatabaseHandler extends SQLiteOpenHelper {
            private static final int DATABASE_VERSION = 1;
            private static final String DATABASE_NAME = "Demo";
            private static final String TABLE_Demo = "demo";
            private static final String KEY_ID = "id";
            private static final String KEY_PATIENT_ID= "patientId";
            private static final String KEY_ReadingType= "readingType";
            private static final String KEY_DeviceMACId= "deviceMACId"; 
            private static final String KEY_DeviceData = "deviceData ";
    
      private static final String KEY_DeviceType= "deviceType";  
            String CREATE_DEMO_TABLE = "CREATE TABLE " + TABLE_Demo +   "("+   
            KEY_ID + " INTEGER PRIMARY KEY,"+ KEY_ReadingType+ " INTEGER ,"  
            +  KEY_DeviceMACId +  "TEXT,"+ KEY_DeviceData + " TEXT,"     
            + KEY_DeviceType +  " TEXT" + ")"; 
    
                public DatabaseHandler(Context context) {
                    super(context, DATABASE_NAME, null, 
    
                }
    
                public void onCreate(SQLiteDatabase db) {
                    db.execSQL(CREATE_DEMO_TABLE);
                }
                public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                    db.execSQL("DROP TABLE IF EXISTS " + TABLE_Demo );
                    onCreate(db);
                }
    
                void addJson(JsonObject json) {
                    SQLiteDatabase db = this.getWritableDatabase();
                    ContentValues values = new ContentValues();
                    values.put(KEY_PATIENT_ID,   json.getString("patientId")); 
                values.put(KEY_ReadingType,json.getString("readingType"));       
                    values.put(KEY_DeviceMACId, json.getString("deviceMACId")); 
                    values.put(KEY_DeviceData , json.getString("deviceData")); 
                    values.put(KEY_DeviceType, json.getString("deviceType")); 
                    db.insert(TABLE_Demo , null, values);
                    db.close();
                }
    
            }
    
  2. Now make a object of this class and store your json object into database like this:

    DatabaseHandler db = new DatabaseHandler (context); 
         // context of your activity or fragment
        try
        {
        db.addJson(JsonObject json);
    

    // here json is your json object that you need to save in database. } catch(Exception e) { }


嗨Dhiraj,谢谢你的回复...我根据你的建议创建了一个类,请帮忙检查一下是对还是错。 - user6649633

0
你可以为这个JSON创建一个模型对象,然后将模型对象保存到数据库中。尝试查找一些关于SQLite数据库的示例,并在你的项目中使用它。

0

首先,您尝试向服务器发送一些JSON数据。然后,您会从服务器获取响应,判断服务器是否在线。如果响应代码不等于200,则将生成的JSON插入到SQLite数据库中。并且您需要经常检查与服务器的连接是否正常。如果服务器在线,则从SQLite数据库获取JSON数据并将其发送到服务器。

SQLite数据库示例 http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/ 连接服务器示例 http://www.androidhive.info/2014/05/android-working-with-volley-library-1/ 使用Volley库进行服务器连接,您可以获取错误响应。


0
  1. 创建一个包含所有字段的sq-lite数据库。
  2. 在数据表中添加一个名为isUpdated的额外字段。
  3. 运行一个单独的线程来检查网络并将数据更新到远程数据库中。
  4. 线程函数[检查互联网可用性,如果互联网可用,则将数据更新到远程数据库中,在更新成功时将isUpdated状态更新为true在您的sq-lite数据库中]

  5. 即使没有互联网,主线程也会定期更新本地sq-lite数据库,其中isUpdated状态为false

这可能对您有所帮助

使用this检查网络可用性

更新远程数据库需要一个Web服务,

 void PutRequest(String URL)
 {
    Ion.with(mContext)
            .load("PUT",URL)
            .setBodyParameter("name","foo")
            .asString();

 }

有关Ion的更多信息,请参见。


Clifford:你好 Clifford,谢谢回复。如果您不介意的话,能否分享一些检查网络并更新远程数据库的代码? - user6649633

0
public class DataBase {
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "demo";
    private static final String TABLE_NAME = "device_data";
    private static final String KEY_ID = "id";
    private static final String KEY_PATIENT_ID = "patientId";
    private static final String KEY_ReadingType = "readingType";
    private static final String KEY_DeviceMACId = "deviceMACId";
    private static final String KEY_DeviceData = "deviceData ";
    private static final String KEY_DeviceType = "deviceType";
    private static final String KEY_TimeStamp = "timeStamp";
    private static final String KEY_AssetId = "assetId";
    private static final String KEY_GeoLocationLattitude = "geoLocationLatitude";
    private static final String KEY_GeoLocationLongitude = "geoLocationLongitude";
    private static final String KEY_ClientId = "clientId";
    private static final String KEY_DeviceRawData = "deviceRawData";

    private final Context context;
    private DataBaseHelper dbHelper;
    public SQLiteDatabase db;

    static final String DATABASE_CREATE = "create table " + TABLE_NAME + "("
            + KEY_ID + " INTEGER PRIMARY KEY," + KEY_ReadingType + " INTEGER ,"
            + KEY_DeviceMACId + "TEXT," + KEY_DeviceData + " TEXT,"
            + KEY_DeviceType + " TEXT," + KEY_TimeStamp + "TEXT," + KEY_AssetId
            + "INTEGER," + KEY_GeoLocationLattitude + "TEXT,"
            + KEY_GeoLocationLongitude + "TEXT," + KEY_ClientId + "INTEGER,"
            + KEY_DeviceRawData + "TEXT" + ")";

    public DataBase(Context _context) {
        context = _context;
        dbHelper = new DataBaseHelper(context, DATABASE_NAME, null,
                DATABASE_VERSION);
    }

    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DATABASE_CREATE);
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

    void addJson(JSONObject json) throws JSONException {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        try {
            values.put(KEY_PATIENT_ID, json.getString("patientId"));
            values.put(KEY_ReadingType, json.getString("readingType"));
            values.put(KEY_DeviceMACId, json.getString("deviceMACId"));
            values.put(KEY_DeviceData, json.getString("deviceData"));
            values.put(KEY_DeviceType, json.getString("deviceType"));
            values.put(KEY_TimeStamp, json.getString("deviceType"));
            values.put(KEY_AssetId, json.getString("deviceType"));
            values.put(KEY_GeoLocationLattitude, json.getString("deviceType"));
            values.put(KEY_GeoLocationLongitude, json.getString("deviceType"));
            values.put(KEY_ClientId, json.getString("deviceType"));
            values.put(KEY_DeviceRawData, json.getString("deviceType"));

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            System.out.println("JsonException........");
            e.printStackTrace();
        }

        db.insert(TABLE_NAME, null, values);
        db.close();
    }

    public DataBase open() throws SQLException {
        db = dbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        db.close();
    }

    public SQLiteDatabase getDatabaseInstance() {
        return db;
    }

是的,没错。只需按照我的答案中提到的方式创建一个该类的对象并将数据插入到您的数据库中即可。 - Dhiraj Choudhary
您的DATABASE_CREATE脚本中缺少patientId字段。 - faranjit
是的,那是我的错误,但仍然出现以下错误: 08-01 12:05:45.458: E/SQLiteDatabase(4109): 错误插入 08-01 12:05:45.458: E/SQLiteDatabase(4109): android.database.sqlite.SQLiteException: near "null": syntax error (code 1): , while compiling: INSERT INTO device_data(null) VALUES (NULL) - user6649633

0
@Dhiraj -i got exception..
08-01 12:05:45.447: I/System.out(4109): In try....com.example.healthdeviceprofilee.DataBase@42187568
08-01 12:05:45.447: I/System.out(4109): JsonException........
08-01 12:05:45.447: W/System.err(4109): org.json.JSONException: No value for patientId
08-01 12:05:45.447: W/System.err(4109):     at org.json.JSONObject.get(JSONObject.java:355)
08-01 12:05:45.447: W/System.err(4109):     at org.json.JSONObject.getString(JSONObject.java:515)
08-01 12:05:45.447: W/System.err(4109):     at com.example.healthdeviceprofilee.DataBase.addJson(DataBase.java:59)
08-01 12:05:45.447: W/System.err(4109):     at com.example.healthdeviceprofilee.DashboardActivity$RestConnection.onPostExecute(DashboardActivity.java:895)
08-01 12:05:45.447: W/System.err(4109):     at com.example.healthdeviceprofilee.DashboardActivity$RestConnection.onPostExecute(DashboardActivity.java:1)
08-01 12:05:45.447: W/System.err(4109):     at android.os.AsyncTask.finish(AsyncTask.java:632)
08-01 12:05:45.447: W/System.err(4109):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
08-01 12:05:45.447: W/System.err(4109):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
08-01 12:05:45.447: W/System.err(4109):     at android.os.Handler.dispatchMessage(Handler.java:102)
08-01 12:05:45.447: W/System.err(4109):     at android.os.Looper.loop(Looper.java:136)
08-01 12:05:45.447: W/System.err(4109):     at android.app.ActivityThread.main(ActivityThread.java:5017)
08-01 12:05:45.458: W/System.err(4109):     at java.lang.reflect.Method.invokeNative(Native Method)
08-01 12:05:45.458: W/System.err(4109):     at java.lang.reflect.Method.invoke(Method.java:515)
08-01 12:05:45.458: W/System.err(4109):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
08-01 12:05:45.458: W/System.err(4109):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
08-01 12:05:45.458: W/System.err(4109):     at dalvik.system.NativeStart.main(Native Method)
08-01 12:05:45.458: E/SQLiteLog(4109): (1) near "null": syntax error
08-01 12:05:45.458: E/SQLiteDatabase(4109): Error inserting 
08-01 12:05:45.458: E/SQLiteDatabase(4109): android.database.sqlite.SQLiteException: near "null": syntax error (code 1): , while compiling: INSERT INTO device_data(null) VALUES (NULL)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at com.example.healthdeviceprofilee.DataBase.addJson(DataBase.java:77)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at com.example.healthdeviceprofilee.DashboardActivity$RestConnection.onPostExecute(DashboardActivity.java:895)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at com.example.healthdeviceprofilee.DashboardActivity$RestConnection.onPostExecute(DashboardActivity.java:1)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.os.AsyncTask.finish(AsyncTask.java:632)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.os.Handler.dispatchMessage(Handler.java:102)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.os.Looper.loop(Looper.java:136)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at android.app.ActivityThread.main(ActivityThread.java:5017)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at java.lang.reflect.Method.invokeNative(Native Method)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at java.lang.reflect.Method.invoke(Method.java:515)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
08-01 12:05:45.458: E/SQLiteDatabase(4109):     at dalvik.system.NativeStart.main(Native Method)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接