【问题标题】:How to Store Json Data into Sqlite?如何将 Json 数据存储到 Sqlite 中?
【发布时间】:2016-07-28 12:27:12
【问题描述】:

嗨,我正在创建一个应用程序,我想在其中将数据从移动设备发送到服务器。但问题是数据仅在服务器在线/启动时才会反映在网站上。当服务器离线时,我得到响应 400 或 502 等数据仅显示在移动屏幕上,它不会反映在服务器上。所以我想创建 Sqlite 数据库,所以当我读取数据时存储在数据库中并想要上传数据,即服务器变为在线。我想插入这个 jon sqlite.i 是 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);

【问题讨论】:

    标签: android json sqlite


    【解决方案1】:

    我的朋友只是做以下事情:

    1. 定义这个类,它将执行与您的数据库创建和操作相关的所有操作,并根据您的需要在这个类中进行更改。

      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. 现在创建一个此类的对象并将您的 json 对象存储到数据库中,如下所示:

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

      // 这里 json 是你需要保存在数据库中的 json 对象。 } 捕捉(异常 e) { }

    【讨论】:

    • 嗨 Dhiraj 感谢您的回复...我根据您的建议创建课程可以请检查是对还是错..
    【解决方案2】:

    您可以为此 json 创建模型对象。然后您可以将模型对象保存到数据库。试着找一些关于 SQLite 数据库的例子,并在你的项目中使用它。

    【讨论】:

      【解决方案3】:

      首先你尝试将一些 json 数据发布到服务器。所以你从服务器得到响应是 up/not。所以检查你的响应代码。如果响应代码不等于 200,你将生成的 json 插入 Sqlite 数据库.并且您经常检查与服务器的连接是否正常。如果服务器在线意味着从 SqliteDB 获取您的 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 库进行服务器连接,您可以获得错误响应

      【讨论】:

        【解决方案4】:
        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;
            }
        

        【讨论】:

        • 是的,就像我的回答中提到的那样,创建一个此类的对象并将数据插入到您的数据库中。
        • DATABASE_CREATE 脚本的表没有 patientId 字段。
        • 是的..这是我的错误 bt 在“null”附近仍然有以下错误:语法错误 08-01 12:05:45.458: E/SQLiteDatabase(4109): Error inserting 08-01 12: 05:45.458: E/SQLiteDatabase(4109): android.database.sqlite.SQLiteException: 接近“null”: 语法错误(代码 1): ,编译时:INSERT INTO device_data(null) VALUES (NULL)
        【解决方案5】:
        1. 创建一个包含 sq-lite 数据库中所有字段的数据库。
        2. 在您的数据表中放置一个名为 isUpdated extra 的字段。
        3. 运行一个单独的线程来检查网络并将数据更新到远程数据库中。
        4. 线程函数[检查互联网可用性,如果互联网可用,将数据更新到远程数据库,更新成功后将您的 sq-lite 数据库中的isUpdated 状态更新为true

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

        这可能对你有帮助

        使用this检查网络可用性

        更新远程数据库需要网络服务,

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

        更多关于Ion的信息

        【讨论】:

        • clifford:嗨,Clifford,感谢您的回复..如果您不介意您可以分享一些检查网络和更新远程数据库的代码吗?
        【解决方案6】:
        @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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-10-28
          • 2015-02-23
          • 2015-05-23
          • 1970-01-01
          • 1970-01-01
          • 2014-04-07
          • 1970-01-01
          相关资源
          最近更新 更多