[英]How can i check to see if my sqlite table has data in it?
編輯,根據下面的答案稍微改變了代碼,但仍然沒有工作。 我還添加了一條日志消息,告訴我getCount是否返回> 0,它是,所以我認為我的查詢可能有問題? 或者我使用光標..
我已經創建了一個表,我想檢查它是否為空,如果它是空的,我想運行一些插入語句(存儲在數組中)。
下面是我的代碼,雖然我沒有錯誤,當我拉出.db文件時,我可以看到它不起作用。 你會如何解決這個問題?
public void onCreate(SQLiteDatabase db) {
Log.i("DB onCreate", "Creating the database...");//log message
db.execSQL(createCATBUDTAB);
db.execSQL(createTWOWEETAB);
try{
Cursor cur = db.rawQuery("SELECT COUNT(*) FROM CAT_BUD_TAB", null);
if (cur.getCount() > 0){
Log.i("DB getCount", " getcount greater than 0");//log message
//do nothing everything's as it should be
}
else{//put in these insert statements contained in the array
Log.i("DB getCount", " getcount less than 0, should read array");//log message
for(int i=0; i<13; i++){
db.execSQL(catInsertArray[i]);
}
}
}catch(SQLiteException e){System.err.println("Exception @ rawQuery: " + e.getMessage());}
}
對不起,如果這是一個非常愚蠢的問題或方法,我對這一切都是新手。 任何答案非常感謝!
現有表上的查詢SELECT COUNT(*)
永遠不應返回null。 如果表中沒有行,則應返回包含值零的一行。
相反,具有非零值的行表示它不為空。
在這兩種情況下,都應返回一行,這意味着它將始終通過
//do nothing everything's as it should be
部分。
要修復它,請按原樣保留查詢(您不希望select column_name
只是因為這是不必要的,可能效率不高)。 將它保留為select count(*)
,它將始終返回一行,並使用以下代碼(僅在我的頭部測試,所以要小心):
Cursor cur = db.rawQuery("SELECT COUNT(*) FROM CAT_BUD_TAB", null);
if (cur != null) {
cur.moveToFirst(); // Always one row returned.
if (cur.getInt (0) == 0) { // Zero count means empty table.
for (int i = 0; i < 13; i++) {
db.execSQL (catInsertArray[i]);
}
}
}
rawQuery
返回一個位於第一個條目之前的Cursor
對象( 在此處查看更多信息) SELECT COUNT(*)
將始終返回結果(考慮到表存在)
所以我會這樣做:
if (cur != null){
cur.moveToFirst();
if (cur.getInt(0) == 0) {
// Empty
}
}
正如paxdiablo所說,游標不會為空。 你能做的就是嘗試這樣:
if (cur != null && cur.getCount() > 0){
// do nothing, everything's as it should be
}
編輯
實際上我使用了db.query(),它對我有用。 我這樣做了
cursor = db.query(TABLE_NAME, new String[] { KEY_TYPE }, null, null, null, null, null);
if (cursor != null && cursor.getCount() > 0)
{
retVal = true;
}
TABLE_NAME是我的表,KEY_TYPE是我的列名
您可以手動檢查:
轉到文件資源管理器中的DDMS。 /data/data/(your application package)/databases
在這里,您將獲得數據庫文件。 如果你想在表格中看到插入的值。
將adb
, aapt
, AdbWinApi.dll
和AdbWinUsbApi.dll
文件從platform_tools復制到tools文件夾。
然后打開命令提示符並將您的路徑設置為存在Android設置的“工具”目錄。 它看起來像: - (Local Drive):\\Android\\android-sdk-windows\\tools
設置路徑后,您將編寫沒有引號的命令“adb shell”。 E:\\Developers\\Android\\android-sdk-windows\\tools> adb shell
按Enter鍵並寫上面列出的DDMS路徑: - # sqlite3 /data/data/(Your Application Package)/databases/name of database
按Enter sqlite>.tables
按Enter鍵,您將獲得該數據庫中存在的所有表名。
sqlite> Select * from table name
該表中存在的所有數據都將顯示。
如有任何進一步的查詢,請隨時評論。
你的意思是它有記錄嗎? 我試過這個,對我來說這是工作
dbCur = db.rawQuery("select * from player", null);
Log.e("a", ""+dbCur.getCount());
它將顯示表的總和,如果表沒有記錄,那么它將顯示0。
我的檢查方式是這樣的:
Cursor cursor = db.query(DbHelper.DB_NAME,DbHelper.DB_C_ID_ONLY,null,null,null,null,null);
if(cursor.isAfterLast())
我得到_id
條目,在我的情況下是自動遞增。 如果DB為空, isAfterLast
肯定會返回true。
這個查詢怎么樣?
SELECT CASE WHEN EXISTS (SELECT * FROM CAT_BUD_TAB) THEN 1 ELSE 0 END
它比SELECT COUNT(*)
略快一些。
PS檢查了900萬行的表格。
已經提到的另一種替代方法是使用de class DatabaseUtils中的函數queryNumEntries 。
一個例子如下:
public boolean checkEmpty(SQLiteDatabase db, String table){
return DatabaseUtils.queryNumEntries(db, table) == 0;
}
對於java程序,這對我有用:
ResultSet rst = stm.executeQuery("SELECT * from Login");
int i = 0;
while(rst.next()){
++i;
System.out.println(i);
}
System.out.println(i);
if(i<1){
//No data in the table
}
else{
//data exists
}
這就是我做的......
Cursor cur = db.rawQuery("SELECT count(*) FROM " + SQLHelper.TABLE_CART, null);
if (cur != null && cur.moveToFirst() && cur.getInt(0) > 0) {
Log.i(getClass().getName(), "table not empty");
}
else {
Log.i(getClass().getName(), "table is empty");
}
我的應用程序崩潰嘗試上面的代碼,所以我這樣做,現在它的工作完美!
public boolean checkIfEmpty()
{
Cursor cursor = getDatabase().query(DatabaseHelper.Products.TABLE,
DatabaseHelper.Products.COLUMNS, null, null, null, null, null);
if (cursor != null)
{
try
{
//if it is empty, returns true.
cursor.moveToFirst();
if (cursor.getInt(0) == 0)
return true;
else
return false;
}
//this error usually occurs when it is empty. So i return true as well. :)
catch(CursorIndexOutOfBoundsException e)
{
return true;
}
}
return false;
}
用這個:
public Boolean doesRecordExist(String TableName, String ColumnName, String ColumnData) {
String q = "Select * FROM "+TableName+" WHERE "+ColumnName+"='"+ColumnData+"';";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(q, null);
if (cursor.moveToFirst()) {
return true;
} else {
return false;
}
}
if (doesRecordExist("student", "name", "John") == true) { //Do Something } else { //Do something }
根據您的用法修改:
String q = "Select * FROM "+TableName+" WHERE "+ColumnName+"='"+ColumnData+"';";
public boolean isEmpty(String TableName){
SQLiteDatabase database = this.getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(database,TableName) == 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.