修改, 根据下面的答案略微更改了代码,但仍然没有使用它。我还添加了一条日志消息,告诉我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());}
}
很抱歉,如果这是一个非常愚蠢的问题或方法,我对这一切都是新手。任何答案都非常感谢!
答案 0 :(得分:31)
现有表上的查询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]);
}
}
}
答案 1 :(得分:7)
rawQuery
返回位于第一个条目之前的Cursor
对象(查看更多信息here)
SELECT COUNT(*)
将始终返回结果(考虑到表存在)
所以我会这样做:
if (cur != null){
cur.moveToFirst();
if (cur.getInt(0) == 0) {
// Empty
}
}
答案 2 :(得分:5)
正如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是我的列名
答案 3 :(得分:2)
你的意思是说它有记录吗? 我试过这个,对我来说这是工作
dbCur = db.rawQuery("select * from player", null);
Log.e("a", ""+dbCur.getCount());
它会显示表格的总和, 如果表没有记录,那么它将显示0。
答案 4 :(得分:2)
您可以手动检查:
在文件资源管理器中转到DDMS。 /data/data/(your application package)/databases
在这里,您将获得数据库文件。如果你想在表格中看到插入的值。
将platform_tools中的adb
,aapt
,AdbWinApi.dll
和AdbWinUsbApi.dll
文件复制到工具文件夹。
然后
打开命令提示符并将路径设置为存在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
该表中存在的所有数据都将显示。
如有任何进一步的查询,请随时发表评论。
答案 5 :(得分:1)
我的检查方式是这样的:
Cursor cursor = db.query(DbHelper.DB_NAME,DbHelper.DB_C_ID_ONLY,null,null,null,null,null);
if(cursor.isAfterLast())
我得到的_id
条目在我的情况下是自动递增的。如果数据库为空,isAfterLast
肯定会返回true。
答案 6 :(得分:1)
这个查询怎么样?
SELECT CASE WHEN EXISTS (SELECT * FROM CAT_BUD_TAB) THEN 1 ELSE 0 END
SELECT COUNT(*)
略快一些。
P.S。检查了900万行的表格。
答案 7 :(得分:1)
已经提到的另一种选择是使用该功能 来自课程queryNumEntries的DatabaseUtils。
一个例子可能如下:
public boolean checkEmpty(SQLiteDatabase db, String table){
return DatabaseUtils.queryNumEntries(db, table) == 0;
}
答案 8 :(得分:1)
对于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
}
答案 9 :(得分:0)
这就是我做的......
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");
}
答案 10 :(得分:0)
我的应用程序崩溃了尝试上面的代码,所以我这样做了,现在它完美运行了!
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;
}
答案 11 :(得分:0)
public boolean isEmpty(String TableName){
SQLiteDatabase database = this.getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(database,TableName) == 0;
}