parsingJSON并将它们保存在SQLite数据库上

我曾经有过这种简单的JSON数据,我可以成功parsing这些属性并将它们保存到SQLite数据库中。

[ { "project_title" : " ", "organization_title" : " ", "website": "", "address": "", "keyword" : "", "short_code" : "", "project_description" : "", "smallImageUrl" : "", "bigImageUrl" : "", "price" : "", "country" : "", "donationAmount" : "", "categories" : "", "campaign_id" : "", "currency_isoname": "", "paypal_email" : "", "elv_available" : "" } ] 

但现在我有这个更复杂的JSON文件:

 [ { "location": { "deleted_at": "null", "documentary_video_length": "81", "id": "15", "latitude": "52.4134145988286", "longitude": "13.0904620846177", "position": "5", "updated_at": "2011-08-26T15:30:27+02:00", "name": "Glienicker Br\u00fccke", "text": "", "documentary_video_url": "", "documentary_thumbnail_url": "", "audio_text_url": "", "footages": [ { "id": "31", "latitude": "52.4134145988286", "longitude": "13.0904620846177", "position": "12", "name": "Glienicker Br\u00fccke 1933", "text": "sdcs", "thumbnail_url": "", "video_url": "", "video_length": "2", "time_period": { "id": "24", "name": "1933" } }, { "id": "32", "latitude": "52.4134145988286", "longitude": "13.0904620846177", "position": "12", "name": "Glienicker Br\u00fccke 1985", "text": "fvd", "thumbnail_url": "", "video_url": "", "video_length": 35, "time_period": { "id": 30, "name": "1985" } }, { "id": "33", "latitude": "52.4134145988286", "longitude": "13.0904620846177", "position": "12", "name": "Glienicker Br\u00fccke 1989", "text": "fghg", "thumbnail_url": "", "video_url": "", "video_length": "41", "time_period": { "id": "12", "name": "1989" } } ] } } ] 

这些是我曾经需要parsingJSON并将其属性保存到SQLite数据库的类。

IntentService类

 public class Sync extends IntentService { public Sync() { super("Sync"); } @Override protected void onHandleIntent(Intent intent) { Database.OpenHelper dbhelper = new Database.OpenHelper(getBaseContext()); SQLiteDatabase db = dbhelper.getWritableDatabase(); DefaultHttpClient httpClient = new DefaultHttpClient(); db.beginTransaction(); HttpGet request = new HttpGet( "https://...."); try { HttpResponse response = httpClient.execute(request); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { InputStream instream = response.getEntity().getContent(); BufferedReader r = new BufferedReader(new InputStreamReader( instream, "UTF-8"), 8000); StringBuilder total = new StringBuilder(); String line; while ((line = r.readLine()) != null) { total.append(line); } instream.close(); String bufstring = total.toString(); JSONArray arr = new JSONArray(bufstring); Database.Tables tab = Database.Tables.AllTables .get(Database.Project.NAME); tab.DeleteAll(db); for (int i = 0; i < arr.length(); i++) { tab.InsertJSON(db, (JSONObject) arr.get(i)); } db.setTransactionSuccessful(); } } catch (Exception e) { e.printStackTrace(); } db.endTransaction(); db.close(); getContentResolver().notifyChange( Uri.withAppendedPath(Provider.CONTENT_URI, Database.Project.NAME), null); } } 

SQLite数据库类

 public class Database { final OpenHelper openHelper; static final String DATABASE_NAME = "mydb"; static final int DATABASE_VERSION = 6; public Database(Context context) throws Exception { openHelper = new OpenHelper(context); } public void Destroy() { openHelper.close(); } public static enum ColumnsTypes { integer, varchar, guid, datetime, numeric }; static final String COLLATE = "COLLATE LOCALIZED"; static final String EMPTY = ""; public static interface Project { public static final String NAME = "Project"; public static String C_PROJECTTITLE = "project_title"; public static String C_ORGANIZATIONTITLE = "organization_title"; public static String C_WEBSITE = "website"; public static String C_ADDRESS = "address"; public static String C_KEYWORD = "keyword"; public static String C_SHORTCODE = "short_code"; public static String C_PROJECTDESCRIPTION = "project_description"; public static String C_SMALLIMAGE = "smallImageUrl"; public static String C_BIGIMAGE = "bigImageUrl"; public static String C_PRICE = "price"; public static String C_COUNTRY = "country"; public static String C_DONATIONAMOUNT = "donationAmount"; public static String C_CATEGORIES = "categories"; public static String C_CAMPAIGNID = "campaign_id"; public static String C_PAYPALEMAIL = "paypal_email"; public static String C_ELVAVAILABLE = "elv_available"; public static String C_CURRENCY = "currency_isoname"; public final static String[] C = new String[] { C_PROJECTTITLE, C_ORGANIZATIONTITLE, C_WEBSITE, C_ADDRESS, C_KEYWORD, C_SHORTCODE, C_PROJECTDESCRIPTION, C_SMALLIMAGE, C_BIGIMAGE, C_PRICE, C_COUNTRY, C_DONATIONAMOUNT, C_CATEGORIES, C_CAMPAIGNID, C_PAYPALEMAIL, C_ELVAVAILABLE, C_CURRENCY }; public final static ColumnsTypes[] CT = new ColumnsTypes[] { ColumnsTypes.varchar, ColumnsTypes.varchar, ColumnsTypes.varchar, ColumnsTypes.varchar, ColumnsTypes.varchar, ColumnsTypes.varchar, ColumnsTypes.varchar, ColumnsTypes.varchar, ColumnsTypes.varchar,ColumnsTypes.varchar, ColumnsTypes.varchar, ColumnsTypes.varchar,ColumnsTypes.varchar, ColumnsTypes.varchar,ColumnsTypes.varchar, ColumnsTypes.varchar, ColumnsTypes.varchar}; public final static boolean[] CN = new boolean[] { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,false }; public final static String[] CS = new String[] { COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE, COLLATE }; } public static class Tables { String[] columns = null; ColumnsTypes[] columnsTypes = null; String[] columnsSpecials = null; String name = null; boolean[] columnsNullable = null; Tables(String name, String[] columns, ColumnsTypes[] columnsTypes, String[] columnsSpecials, boolean[] columnsNullable) { this.name = name; this.columns = columns; this.columnsTypes = columnsTypes; this.columnsSpecials = columnsSpecials; this.columnsNullable = columnsNullable; } public String DropStatment() { return "DROP TABLE IF EXISTS " + name; } public void DeleteAll(SQLiteDatabase db) { db.delete(name, null,null); } public long InsertJSON(SQLiteDatabase db, JSONObject obj) throws JSONException { ContentValues vals = new ContentValues(); for (String col : columns) { vals.put(col, obj.getString(col)); } return db.insert(name, null, vals); } public String CreateStatment() { StringBuilder sb = new StringBuilder("CREATE TABLE "); sb.append(name); sb.append(" (["); for (int i = 0; i < columns.length; i++) { sb.append(columns[i]); sb.append("] "); sb.append(columnsTypes[i].name()); sb.append(' '); sb.append(columnsSpecials[i]); if (!columnsNullable[i]) sb.append(" NOT NULL "); sb.append(", ["); } sb.append("_id] INTEGER PRIMARY KEY AUTOINCREMENT);"); return sb.toString(); } public final static Map<String, Tables> AllTables; static { HashMap<String, Tables> aMap = new HashMap<String, Tables>(); aMap.put(Project.NAME, new Tables(Project.NAME, Project.C, Project.CT, Project.CS, Project.CN)); AllTables = Collections.unmodifiableMap(aMap); } } public static class OpenHelper extends SQLiteOpenHelper { public OpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { try { for (Tables table : Tables.AllTables.values()) { String create = table.CreateStatment(); db.execSQL(create); } } catch (Exception e) { Log.e("Exception", e.toString()); } } public OpenHelper Recreate() { onUpgrade(getWritableDatabase(), 1, 2); return this; } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { for (Tables table : Tables.AllTables.values()) { db.execSQL(table.DropStatment()); } onCreate(db); } } 

}

ContentProvider类

 public class Provider extends ContentProvider { @Override public int delete(Uri arg0, String arg1, String[] arg2) { return 0; } private static final int PROJECTS = 1; private static final int PROJECT = 2; public static final String PROJECTS_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/Project"; public static final String PROJECT_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/Project"; public static final String AUTHORITY = "spendino.de"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY); static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); static final HashMap<String, String> map = new HashMap<String, String>(); static { matcher.addURI(AUTHORITY, "Project", PROJECTS); matcher.addURI(AUTHORITY, "Project/#", PROJECT); map.put(BaseColumns._ID, BaseColumns._ID); map.put(Database.Project.C_BIGIMAGE, Database.Project.C_BIGIMAGE); map.put(Database.Project.C_COUNTRY, Database.Project.C_COUNTRY); map.put(Database.Project.C_KEYWORD, Database.Project.C_KEYWORD); map.put(Database.Project.C_ORGANIZATIONTITLE, Database.Project.C_ORGANIZATIONTITLE); map.put(Database.Project.C_PRICE, Database.Project.C_PRICE); map.put(Database.Project.C_PROJECTDESCRIPTION, Database.Project.C_PROJECTDESCRIPTION); map.put(Database.Project.C_PROJECTTITLE, Database.Project.C_PROJECTTITLE); map.put(Database.Project.C_SHORTCODE, Database.Project.C_SHORTCODE); map.put(Database.Project.C_SMALLIMAGE, Database.Project.C_SMALLIMAGE); map.put(Database.Project.C_DONATIONAMOUNT, Database.Project.C_DONATIONAMOUNT); map.put(Database.Project.C_WEBSITE, Database.Project.C_WEBSITE); map.put(Database.Project.C_ADDRESS, Database.Project.C_ADDRESS); map.put(Database.Project.C_CATEGORIES, Database.Project.C_CATEGORIES); map.put(Database.Project.C_CAMPAIGNID, Database.Project.C_CAMPAIGNID); map.put(Database.Project.C_PAYPALEMAIL, Database.Project.C_PAYPALEMAIL); map.put(Database.Project.C_ELVAVAILABLE, Database.Project.C_ELVAVAILABLE); map.put(Database.Project.C_CURRENCY, Database.Project.C_CURRENCY); } @Override public String getType(Uri uri) { switch (matcher.match(uri)) { case PROJECTS: return PROJECTS_MIME_TYPE; case PROJECT: return PROJECT_MIME_TYPE; default: throw new IllegalArgumentException("Unknown URL " + uri); } } @Override public Uri insert(Uri arg0, ContentValues arg1) { // TODO Auto-generated method stub return null; } private Database.OpenHelper mDB; @Override public boolean onCreate() { try { mDB = new Database.OpenHelper(getContext()); } catch (Exception e) { Log.e("Exception", e.getLocalizedMessage()); return false; } return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); switch (matcher.match(uri)) { case PROJECTS: String table = uri.getPathSegments().get(0); builder.setTables(table); break; case PROJECT: table = uri.getPathSegments().get(0); builder.setTables(table); selection = "_id=?"; selectionArgs = new String[] { uri.getPathSegments().get(1) }; break; default: throw new IllegalArgumentException("Unknown URL " + uri); } builder.setProjectionMap(map); Cursor cursor = builder.query(mDB.getReadableDatabase(), projection, selection, selectionArgs, null, null, sortOrder); if (cursor == null) { return null; } cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor; } public int update(Uri uri, ContentValues cv, String selection, String[] selectionArgs) { String table = null; SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); switch (matcher.match(uri)) { case PROJECTS: table = uri.getPathSegments().get(0); builder.setTables(table); break; case PROJECT: table = uri.getPathSegments().get(0); builder.setTables(table); selection = "_id=?"; selectionArgs = new String[] { uri.getPathSegments().get(1) }; break; default: throw new IllegalArgumentException("Unknown URL " + uri); } return mDB.getWritableDatabase().update(table, cv, selection, selectionArgs); } } 

为了使新的JSON文件parsing并保存到SQLite数据库中,我需要在上面的类中进行更改? 我在这里说,因为我的旧JSON文件没有数组,但我想重新使用我已经有的类。 我知道我需要更改列名称并根据我的SQLite数据库和提供程序类的JSON属性自定义string

谢谢

Related of "parsingJSON并将它们保存在SQLite数据库上"

你可以使用Gson或Jackson 。 这些库允许您parsing/生成JSONinput/输出,轻松构build您的类“bean”。

例如在Gson,如果你有一个叫做Car的类,

 class Car{ int wheels; String plate; } 

…并且你想要parsing一系列的汽车,你可以用这种方式轻松地扩充你的JSON:

 Gson gson = new Gson; List<Car> cars = gson.fromJson(input, new TypeToken<List<Car>>(){}.getType()); 

非常酷的事情是,它能够理解你已经包含数组parsing它没有麻烦(我指的是你的input)。

欢呼声,西蒙娜

尝试GSON –

并尝试改变你的代码devise,希望它会帮助你。

如果你的问题是,如何parsing新的JSONstring,这是非常简单的…

parsing一个JSON数组(任何封闭在[]东西),你会使用…

 JSONArray jsonArray = new JSONArray(String json); 

并parsing一个JSON对象(封装在{}任何东西),您将使用…

 JSONObject jsonObject = new JSONObject(String json); 

现在,为了parsing上面指定的JSONstring,它会是…

 JSONArray jsonArray = new JSONArray(String input); JSONObject location = jsonArray.getJSONObject(0).getJSONObject("location"); 

获得footages元素…

 JSONArray footages = location.getJSONArray("footages"); 

然后你可以循环遍历数组,并进行处理。

至于将数据存储到数据库中,将数据存储为数据库中的JSONstring可能是个好主意,因为它是JSON数组。