2014-10-10 85 views
1

我想把一個普通的POJO放到ContentValues中,並在ContentProvider中解組它。如何編組/將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

我一直在試圖插入android.location.Location成通過ContentProvider SQLite:

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

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

填充值/宗地。

問題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()?

回答

2

這工作:

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; 
} 
+0

這恐怕是行不通的。如果你遵循'insert'的源代碼,你會發現來自'ContentValues'的值傳遞給'bindOjectToProgram',這是構建查詢的最後一步。在這種方法中,測試對象的類型。 'Location'不是一個已知類型,這意味着表中的數據最終是'toString'表示。 – njzk2 2014-10-10 23:50:33

+1

將POJO放入地圖(並將識別的類型放入ContentValues中)需要更多的工作。您可以查看'Gson',因爲它提供了從對象到JSON的映射,實際上它提供了一種從對象映射到與SQL兼容的映射的方式。 – njzk2 2014-10-10 23:53:37

+1

否則,這是我寫的其他文章的主題:http://njzk2.wordpress.com/2013/07/09/storage-is-simple-part-1-sql/其中我經過的基礎對象映射。這個想法是,你需要找出一種方法來告訴sql如何處理你需要存儲的每種類型。 – njzk2 2014-10-10 23:55:42