12

我曾经有过这种简单的 JSON 数据,我可以成功地解析属性并将它们保存到 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"
          }
        }
      ]
    }
  }
]

这些是我用来解析 JSON 并将它们的属性保存到 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);
        }

    }       

}

内容提供者类

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 文件被解析并保存到 SQLite 数据库中,我需要对上述类进行哪些更改?我在这里发言是因为我的旧 JSON 文件上没有数组,但我想重新使用我已经拥有的类。我知道我需要根据我的 SQLite 数据库和提供程序类上的 JSON 属性更改列名并自定义字符串

谢谢

4

3 回答 3

15

您可以使用GsonJackson。这些库允许您解析/生成 JSON 输入/输出,轻松构建您的类“bean”。

例如在 Gson 中,如果你有一个名为 Car 的类以这种方式构建:

class Car{
  int wheels;
  String plate;
}

...并且您想解析一系列汽车,您可以通过这种方式轻松地扩充您的 JSON:

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

非常酷的事情是它能够理解你已经包含数组并且可以毫无问题地解析它(我指的是你的输入)。

干杯,西蒙娜

于 2012-04-10T22:15:58.997 回答
3

试试 GSON -

并尝试更改您的代码设计,希望对您有所帮助。

于 2012-04-05T11:45:39.177 回答
2

如果您的问题是,如何解析新的 JSON 字符串,这很简单......

要解析 JSON 数组(包含在 中的任何内容[]),您可以使用...

JSONArray jsonArray = new JSONArray(String json);

并解析 JSON 对象(包含在 中的任何内容{}),您将使用...

JSONObject jsonObject = new JSONObject(String json);

现在,要解析您在上面指定的 JSON 字符串,它类似于...

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

获取footages元素...

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

然后你可以遍历footages数组并进行处理。

就将数据存储到数据库而言,最好将其footages作为 JSON 字符串存储在数据库中,因为它是一个 JSON 数组。

于 2012-04-14T21:29:24.537 回答