如何编组/解组ContentValues以将通用类型插入到ContentProvider中?

时间:2014-10-10 20:19:00

标签: android-contentprovider parcelable parcel

我想将一个通用POJO放入ContentValues并在ContentProvider中解组它。

我一直在破坏我的小脑子:Parcelables,ContentValues和插入SQLite 关于: http://njzk2.wordpress.com/2013/05/31/map-to-contentvalues-abusing-parcelable/

How to write a common code for inserting data in android's Sqlite

我一直试图通过ContentProvider将android.location.Location插入到SQLite中:

Location loc = mLocationClient.getLastLocation();
myParcel = android.os.Parcel.obtain();
loc.writeToParcel(myParcel, 0);

ContentValues values = ContentValues.CREATOR.createFromParcel(myParcel );

用parcel填充值。

问题1) 这是我的ContentProvider.insert方法:

@Override
public Uri insert( final Uri uri, final ContentValues values ){
SQLiteDatabase db = Mydatabase.getWritableDatabase();

//db.insert() doesn’t unmarshal the values??
db.insert(  myTABLE_NAME, “”, values);

Uri result = null;
db.close();
return result;
}

这失败了,因为db.insert()没有解组值(我相信) 插入android.database.sqlite.SQLiteException时出错:INSERT INTO myTABLE_NAME()VALUES(NULL)

问题2) 有没有什么方法可以先解组值,然后将其封送回另一个ContentValues变量?也许w / getKey()???

1 个答案:

答案 0 :(得分:3)

这有效:

HashMap hm = new HashMap();
Location loc = mLocationClient.getLastLocation();
hm.put("LOCATIONS", loc);

android.os.Parcel myParcel = android.os.Parcel.obtain();    
myParcel.writeMap(hm);
myParcel.setDataPosition(0);

ContentValues values = ContentValues.CREATOR.createFromParcel(myParcel);

getContentResolver().insert(MyUri, values);

然后

@Override
public Uri insert( final Uri uri, final ContentValues oldvalues ){
SQLiteDatabase db = GAELdatabase.getWritableDatabase();

Uri result = null;
Location loc = (Location)oldvalues.get("LOCATIONS");

ContentValues values = new ContentValues();

values.put("ALTITUDE", loc.getAltitude());//meters above sea level
values.put("LATITUDE", loc.getLatitude());
values.put("LONGITUDE", loc.getLongitude());

long rowID = db.insert( "MyTABLE_NAME", "", values);
db.close();
return result;
}