我曾经有过这种简单的 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 属性更改列名并自定义字符串
谢谢