Android的SQLite如何检查一个logging是否存在
我想检查一个logging是否存在。
这是我试过的:
MainActivity.class
public void onTextChanged(CharSequence s, int start, int before, int count) { System.out.println("Ontext changed " + new String(s.toString())); strDocumentFrom = s.toString(); if(s.toString().isEmpty()){ } else { try{ strTransactionDate = dbHelper.getTransactionDateByDocumentNumber(strDocumentFrom); //strTotalAmount = dbHelper.getTotalAmountByDocumentNumber(strDocumentFrom); //strVan = dbHelper.getVanByDocumentNumber(strDocumentFrom); //etTransactionDate.setText(strTransactionDate); //etTotalAmount.setText(strTotalAmount); //Log.d("Van", "" + strVan); //etVan.setText(strVan); } catch (SQLiteException e) { e.printStackTrace(); Toast.makeText(ReceivingStocksHeader.this, "Document number does not exist.", Toast.LENGTH_SHORT).show(); } }
DBHelper.class
// TODO DISPLAYING RECORDS TO TRANSRCVHEADER public String getTransactionDateByDocumentNumber(String strDocumentNumber){ String[] columns = new String[]{KEY_TRANSACTIONDATE}; Cursor c = myDataBase.query(TBL_INTRANS, columns, null, null, null, null, null, null); if(c != null){ c.moveToFirst(); String date = c.getString(0); return date; } else { Log.d("Error", "No record exists"); } return null; }
但它没有得到它的捕获块显示敬酒。
我在这里做错了什么?
public static boolean CheckIsDataAlreadyInDBorNot(String TableName, String dbfield, String fieldValue) { SQLiteDatabase sqldb = EGLifeStyleApplication.sqLiteDatabase; String Query = "Select * from " + TableName + " where " + dbfield + " = " + fieldValue; Cursor cursor = sqldb.rawQuery(Query, null); if(cursor.getCount() <= 0){ cursor.close(); return false; } cursor.close(); return true; }
我希望这对你有用…如果logging已经存在于db中,这个函数返回true。 否则返回false。
这些都是很好的答案,但是很多忘记closures游标和数据库 。 如果你不closures游标或数据库,你可能会遇到内存泄漏。
另外:
使用包含非字母/数字字符的String
进行search时,可能会出现错误。 例如:“ 1a5f9ea3-ec4b-406b-a567-e6927640db40
”。 那些破折号( -
)将导致unrecognized token
错误。 你可以通过把string放在数组中来克服这个问题。 因此,习惯于这样查询:
public boolean hasObject(String id) { SQLiteDatabase db = getWritableDatabase(); String selectString = "SELECT * FROM " + _TABLE + " WHERE " + _ID + " =?"; // Add the String you are searching by here. // Put it in an array to avoid an unrecognized token error Cursor cursor = db.rawQuery(selectString, new String[] {id}); boolean hasObject = false; if(cursor.moveToFirst()){ hasObject = true; //region if you had multiple records to check for, use this region. int count = 0; while(cursor.moveToNext()){ count++; } //here, count is records found Log.d(TAG, String.format("%d records found", count)); //endregion } cursor.close(); // Dont forget to close your cursor db.close(); //AND your Database! return hasObject; }
你也可以看到这个:
if (cursor.moveToFirst()) { // record exists } else { // record not found }
要么
你只是检查游标不为null之后,为什么你检查计数不是0。
所以,你试试这个…
DBHelper.getReadableDatabase(); Cursor mCursor = db.rawQuery("SELECT * FROM " + DATABASE_TABLE + " WHERE yourKey=? AND yourKey1=?", new String[]{keyValue,keyvalue1}); if (mCursor != null) { return true; /* record exist */ } else { return false; /* record not exist */ }
原始查询更容易受到SQL注入的影响。 我会build议使用query()
方法。
public boolean Exists(String searchItem) { String[] columns = { COLUMN_NAME }; String selection = COLUMN_NAME + " =?"; String[] selectionArgs = { searchItem }; String limit = "1"; Cursor cursor = db.query(TABLE_NAME, columns, selection, selectionArgs, null, null, null, limit); boolean exists = (cursor.getCount() > 0); cursor.close(); return exists; }
来源: 这里
您可以使用SELECT EXISTS
命令并从文档中使用rawQuery
执行cursor
EXISTS操作符总是计算整数值0和1之一。如果执行指定为EXISTS操作符的右侧操作数的SELECT语句将返回一个或多个行,则EXISTS操作符的计算结果为1.如果执行SELECT根本不会返回任何行,那么EXISTS操作符的计算结果为0。
我已经尝试了在这个页面提到的所有方法,但只有下面的方法对我很好。
Cursor c=db.rawQuery("SELECT * FROM user WHERE idno='"+txtID.getText()+"'", null); if(c.moveToFirst()) { showMessage("Error", "Record exist"); } else { // Inserting record }
SQLiteDatabase sqldb = MyProvider.db; String Query = "Select * from " + TABLE_NAME ; Cursor cursor = sqldb.rawQuery(Query, null); cursor.moveToLast(); //if you not place this cursor.getCount() always give same integer (1) or current position of cursor. if(cursor.getCount()<=0){ Log.v("tag","if 1 "+cursor.getCount()); return false; } Log.v("tag","2 else "+cursor.getCount()); return true;
如果你不使用cursor.moveToLast()
;
cursor.getCount()
总是给出相同的整数( 1
)或光标的当前位置。
代码:
private String[] allPushColumns = { MySQLiteHelper.COLUMN_PUSH_ID, MySQLiteHelper.COLUMN_PUSH_TITLE, MySQLiteHelper.COLUMN_PUSH_CONTENT, MySQLiteHelper.COLUMN_PUSH_TIME, MySQLiteHelper.COLUMN_PUSH_TYPE, MySQLiteHelper.COLUMN_PUSH_MSG_ID}; public boolean checkUniqueId(String msg_id){ Cursor cursor = database.query(MySQLiteHelper.TABLE_PUSH, allPushColumns, MySQLiteHelper.COLUMN_PUSH_MSG_ID + "=?", new String [] { msg_id }, null, null, MySQLiteHelper.COLUMN_PUSH_ID +" DESC"); if(cursor.getCount() <= 0){ return false; } return true; }
由于可能的数据泄漏通过光标的最佳解决scheme:
Cursor cursor = null; try { cursor = .... some query (raw or not your choice) return cursor.moveToNext(); } finally { if (cursor != null) { cursor.close(); } }
1)从API KITKAT你可以使用资源try()
try (cursor = ...some query)
2)如果您查询VARCHAR TYPE使用'…'例如。 COLUMN_NAME = 'string_to_search'
3)不要使用moveToFirst()当你需要从开始迭代开始使用
4)避免getCount()是昂贵的 – 它迭代了很多logging来计算它们。 它不会返回一个存储的variables。 第二个电话可能有一些caching,但第一个电话在计数之前不知道答案。
这是一个基于dipali和Piyush Gupta发布的简单解决scheme:
public boolean dbHasData(String searchTable, String searchColumn, String searchKey) { String query = "Select * from " + searchTable + " where " + searchColumn + " = ?"; return getReadableDatabase().rawQuery(query, new String[]{searchKey}).moveToFirst(); }
尝试使用cursor.isNull方法。 例:
song.isFavorite = cursor.isNull(cursor.getColumnIndex("favorite"));