SQLite数据库没有为棒棒糖插入ID
SQLitedatabase not inserting id for lollipop
我有以下代码在数据库中插入 contentValues。我使用 SQLite 数据库方法 insert() 在数据库中插入值,如下所示:
public static final String ID = "id";
public boolean replaceOrUpdate(DBListener dbListener,final String sTable, ContentValues[] contentValues,String tag) {
this.mDbListener=dbListener;
if(mDatabase == null) {
openDB();
}
mDatabase.beginTransaction();
try {
int count = contentValues.length;
for (int i=0; i<count;i++) {
ContentValues value = contentValues[i];
long id = mDatabase.replaceOrThrow(sTable,null,value);
}
mDatabase.setTransactionSuccessful();
mDbListener.onCompleteInsertion(tag);
}catch (Exception e) {
Log.v("Exception = " , " " + e.toString());
e.printStackTrace();
}finally {
mDatabase.endTransaction();
}
return true;
}
public ArrayList<String> getAllPlacesIDs()
{
ArrayList<String> ids = new ArrayList<String>();
try
{
if(mDatabase==null || !mDatabase.isOpen())
{
openDB();
}
String query="SELECT "+DBUtil.ID+" FROM "+TABLE_MERCHANT_STORES;
Cursor cursor = mDatabase.rawQuery(query,null);
for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext())
{
ids.add(cursor.getString(cursor.getColumnIndex(DBUtil.ID)));
}
cursor.close();
}catch(SQLException sqx)
{
sqx.printStackTrace();
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
}
return ids;
}
table创建如下:
db.execSQL("CREATE TABLE IF NOT EXISTS "+
TABLE_MERCHANT_STORES +" ("+
AUTO_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+
DBUtil.ID +" INTEGER NOT NULL UNIQUE, "+...)
此代码在棒棒糖之前的设备上运行良好,但插入在棒棒糖上无法正常运行。它似乎卡在某些值上并继续在 table 中插入缺失值。插入后,当我打印所有值时,它们按升序显示,缺少一些中间值。 table 中存储的 id 值是
1
2个
3个
4个
5个
7
11
13
14
15
16
17
19
而在 pre-lollipop 上插入(预期)的值是:
514
533
531
312
434
162
253
252
151
344
153
160
658
在棒棒糖设备上看到的错误模式是,当在 table 中插入一个 ID 时,查询似乎会继续插入最后一个最大 ID 和当前最大 ID 之间的间隙,只要下一个它收到的 id 不大于当前插入的 id。这是棒棒糖sqlite中的错误吗?或者它是特定于我的设备的东西?应用程序中没有实现此类逻辑。我该如何纠正这个问题?是因为使用的字符串是 id 吗?它在 pre-lollipop 设备上工作正常,但在 lollipop 上工作错误。
编辑:
我添加值的方式如下:
private void insertIntoDB() {
int count = jsonArray.length();
ContentValues[] values = new ContentValues[count];
for(int i=0;i<count;i++){
JSONObject storeObject=jsonArray.getJSONObject(i);
if(storeObject!=null){
ContentValues value=new ContentValues();
value.put(DBUtil.ID, storeObject.getInt("id"));
mArrId.add(storeObject.getInt("id")+"");
value.put("place_parent", storeObject.getInt("place_parent"));
}
}
Cursor c1=new MylocalCursorLoader(mContext, "Delete from " + DBUtil.TABLE_MERCHANT_STORES).loadInBackground();
if(c1!=null){
DBUtil dbUtil = DBUtil.getInstance(mContext.getApplicationContext());
dbUtil.replaceOrUpdate(this, DBUtil.TABLE_MERCHANT_STORES, values,"merchant-stores");
mProgess.setVisibility(View.VISIBLE);
}
}
MyLocalCursorLoader 是一个 class 扩展 CursorLoader。 storeObject.getInt("id") 的值顺序为
514
533
531
312
434
162
253
252
151
344
153
160
658
虽然没有看到您的所有代码,但问题似乎与传递给您的 replaceOrUpdate()
方法的 ContentValues[]
有关。
您可以在方法中的循环中添加一个日志行以验证是否属于这种情况:
for (int i=0; i<count;i++) {
ContentValues value = contentValues[i];
long id = mDatabase.replaceOrThrow(sTable,null,value);
// Check output between Lollipop and earlier platform versions
Log.v("DBUtil", "replaceOrThrow() returned " + id + "; value=" + value.toString());
}
否则,如果您可以 post 填充 ContentValues[]
的代码,这可能会帮助您更快地获得更直接的答案。
我找到了解决方法。如果我在 table 中创建 DBUtil.ID 属性时删除 UNIQUE,那么它工作正常。我仍然不知道造成这种情况的确切原因。如果有人能澄清这种荒谬行为的原因,我们将不胜感激。
我有以下代码在数据库中插入 contentValues。我使用 SQLite 数据库方法 insert() 在数据库中插入值,如下所示:
public static final String ID = "id";
public boolean replaceOrUpdate(DBListener dbListener,final String sTable, ContentValues[] contentValues,String tag) {
this.mDbListener=dbListener;
if(mDatabase == null) {
openDB();
}
mDatabase.beginTransaction();
try {
int count = contentValues.length;
for (int i=0; i<count;i++) {
ContentValues value = contentValues[i];
long id = mDatabase.replaceOrThrow(sTable,null,value);
}
mDatabase.setTransactionSuccessful();
mDbListener.onCompleteInsertion(tag);
}catch (Exception e) {
Log.v("Exception = " , " " + e.toString());
e.printStackTrace();
}finally {
mDatabase.endTransaction();
}
return true;
}
public ArrayList<String> getAllPlacesIDs()
{
ArrayList<String> ids = new ArrayList<String>();
try
{
if(mDatabase==null || !mDatabase.isOpen())
{
openDB();
}
String query="SELECT "+DBUtil.ID+" FROM "+TABLE_MERCHANT_STORES;
Cursor cursor = mDatabase.rawQuery(query,null);
for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext())
{
ids.add(cursor.getString(cursor.getColumnIndex(DBUtil.ID)));
}
cursor.close();
}catch(SQLException sqx)
{
sqx.printStackTrace();
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
}
return ids;
}
table创建如下:
db.execSQL("CREATE TABLE IF NOT EXISTS "+
TABLE_MERCHANT_STORES +" ("+
AUTO_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+
DBUtil.ID +" INTEGER NOT NULL UNIQUE, "+...)
此代码在棒棒糖之前的设备上运行良好,但插入在棒棒糖上无法正常运行。它似乎卡在某些值上并继续在 table 中插入缺失值。插入后,当我打印所有值时,它们按升序显示,缺少一些中间值。 table 中存储的 id 值是
1 2个 3个 4个 5个 7 11 13 14 15 16 17 19
而在 pre-lollipop 上插入(预期)的值是:
514 533 531 312 434 162 253 252 151 344 153 160 658
在棒棒糖设备上看到的错误模式是,当在 table 中插入一个 ID 时,查询似乎会继续插入最后一个最大 ID 和当前最大 ID 之间的间隙,只要下一个它收到的 id 不大于当前插入的 id。这是棒棒糖sqlite中的错误吗?或者它是特定于我的设备的东西?应用程序中没有实现此类逻辑。我该如何纠正这个问题?是因为使用的字符串是 id 吗?它在 pre-lollipop 设备上工作正常,但在 lollipop 上工作错误。
编辑:
我添加值的方式如下:
private void insertIntoDB() {
int count = jsonArray.length();
ContentValues[] values = new ContentValues[count];
for(int i=0;i<count;i++){
JSONObject storeObject=jsonArray.getJSONObject(i);
if(storeObject!=null){
ContentValues value=new ContentValues();
value.put(DBUtil.ID, storeObject.getInt("id"));
mArrId.add(storeObject.getInt("id")+"");
value.put("place_parent", storeObject.getInt("place_parent"));
}
}
Cursor c1=new MylocalCursorLoader(mContext, "Delete from " + DBUtil.TABLE_MERCHANT_STORES).loadInBackground();
if(c1!=null){
DBUtil dbUtil = DBUtil.getInstance(mContext.getApplicationContext());
dbUtil.replaceOrUpdate(this, DBUtil.TABLE_MERCHANT_STORES, values,"merchant-stores");
mProgess.setVisibility(View.VISIBLE);
}
}
MyLocalCursorLoader 是一个 class 扩展 CursorLoader。 storeObject.getInt("id") 的值顺序为
514 533 531 312 434 162 253 252 151 344 153 160 658
虽然没有看到您的所有代码,但问题似乎与传递给您的 replaceOrUpdate()
方法的 ContentValues[]
有关。
您可以在方法中的循环中添加一个日志行以验证是否属于这种情况:
for (int i=0; i<count;i++) {
ContentValues value = contentValues[i];
long id = mDatabase.replaceOrThrow(sTable,null,value);
// Check output between Lollipop and earlier platform versions
Log.v("DBUtil", "replaceOrThrow() returned " + id + "; value=" + value.toString());
}
否则,如果您可以 post 填充 ContentValues[]
的代码,这可能会帮助您更快地获得更直接的答案。
我找到了解决方法。如果我在 table 中创建 DBUtil.ID 属性时删除 UNIQUE,那么它工作正常。我仍然不知道造成这种情况的确切原因。如果有人能澄清这种荒谬行为的原因,我们将不胜感激。