2011-08-15 184 views
0

我在写你,因为我试图找出如何让这个查询在Android上工作,我知道sintaxis是好的,因为我曾在SQLite浏览器但我不知道为什么它不给我任何Android的结果,这是我在Android上使用的代码:查询适用于SQLite浏览器,但不适用于Android SQlLite

public long getAdminOrMemberOrGroupID (String arg, char option){ 
    Cursor result = null; 
    String[] selectionArgs = new String[] { arg }; 
    long idResult = 0; 
    int idIndex=0; 

    switch(option){ 
    case 'a': 
     result = db.rawQuery("SELECT _id FROM Admins WHERE mac=?", selectionArgs); 
     //result = db.rawQuery("SELECT _id FROM Admins WHERE mac= '"+ arg +"'", null); 
     //result = db.query(DATABASE_TABLE_ADMINS, new String[]{KEY_ID}, KEY_MAC + "= '" + arg + "'" , null, null, null, null); 
    case 'm': 
     result = db.rawQuery("SELECT _id FROM Members WHERE mac=?", selectionArgs); 
     //result = db.rawQuery("SELECT _id FROM Members WHERE mac= '"+ arg +"'", null); 
     //result = db.query(DATABASE_TABLE_MEMBERS, new String[]{KEY_ID}, KEY_MAC + "= '" + arg + "'", null, null, null, null); 
    case 'g': 
     result = db.rawQuery("SELECT _id FROM Groups WHERE name=?", selectionArgs); 
     ////result = db.rawQuery("SELECT _id FROM Groups WHERE name= '"+ arg +"'", null); 
     //result = db.query(DATABASE_TABLE_GROUPS, new String[]{KEY_ID}, KEY_NAME + "= '" + arg + "'", null, null, null, null); 

    } 

    idIndex = result.getColumnIndex(KEY_ID); 

    if(result!=null){ 
     if (result.isFirst()){ 
      idResult= result.getLong(idIndex); 
     } 
    } 

    return idResult; 
} 

正如你所看到的,我试图做到这一点在几个方式,但没有一个能够正常工作,它不会返回任何结果。我已经使用DDMS将数据库文件拖到我的电脑上,并在SQLite浏览器上尝试相同的查询,并且这可以工作。那么,之前显示的代码的问题在哪里?

感谢在这个问题上的任何帮助,

添,那就是:创建该表

public static final String KEY_ID = "_id"; 
public static final String KEY_NAME = "name"; 
public static final int NAME_COLUMN = 1; 
public static final String KEY_MAC = "mac"; 
public static final int MAC_COLUMN = 2; 
public static final String KEY_GPS = "gps"; 
public static final int GPS_COLUMN = 3; 
public static final String KEY_ID_ADMIN = "idAdmin"; 
public static final String KEY_ID_GROUP = "idGroup"; 

private static final String DATABASE_CREATE_ADMINS = "create table " + DATABASE_TABLE_ADMINS + 
"(" + KEY_ID + " integer primary key autoincrement, " + KEY_NAME + " text not null, " + KEY_MAC + " text not null);"; 
private static final String DATABASE_CREATE_GROUPS = "create table " + DATABASE_TABLE_GROUPS + 
"(" + KEY_ID + " integer primary key autoincrement, " + KEY_ID_ADMIN + " integer, " + KEY_NAME + " text not null);"; 
private static final String DATABASE_CREATE_MEMBERS = "create table " + DATABASE_TABLE_MEMBERS + 
"(" + KEY_ID + " integer primary key autoincrement, " + KEY_NAME + " text not null, " + KEY_MAC + " text not null, " 
    + KEY_GPS + " text, " + KEY_ID_GROUP + " integer);"; 

方法

public void createDataBase() throws IOException{ 

    boolean dbExist = checkDataBase(); 

    if(dbExist){ 
     //do nothing - database already exist 
    }else{ 
     db = context.openOrCreateDatabase(DATABASE_NAME, SQLiteDatabase.CREATE_IF_NECESSARY, null); 
     db.execSQL(DATABASE_CREATE_ADMINS); 
     db.execSQL(DATABASE_CREATE_MEMBERS); 
     db.execSQL(DATABASE_CREATE_GROUPS); 
    } 

} 

private boolean checkDataBase(){ 

    SQLiteDatabase checkDB = null; 

    try{ 
     String myPath = DATABASE_PATH + DATABASE_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

    }catch(SQLiteException e){ 

     //database does't exist yet. 

    } 

    if(checkDB != null){ 

     checkDB.close(); 

    } 

    return checkDB != null ? true : false; 
} 
+0

我会在Android中调试应用程序,并检查传入方法的所有内容是否正确,并且构建的查询是您期望/在SQLite浏览器中测试过的。 –

+0

你在哪里创建/定义你的表,在Android或Android之外使用SQLite浏览器?你能发表你的表格吗? – Tim

+0

我当然已经这样做了,这就是我发布之前一直在做的事情,代码已经在查询类型下进行了测试(使用调试器),并且我已经尝试了SQLite Brower上调试器给出的sql语句,并且它在该应用程序上给出了期望的结果 – Andres

回答

4

文档说,返回的游标对象位于第一个条目之前。我认为在这种情况下第一个将总是返回错误。 result.moveToFirst()? 检查返回的条目数量。

+0

Deucalion是正确的 - 在'rawQuery'的文档中,它表示游标在第一行之前返回指向**的位置。所以如果你用'if(result.moveToFirst())'替换'if(result.isFirst())',你的问题应该被解决。 –

+0

谢谢PresidentMevil!有用! – Andres

+0

谢谢@PresidentEvil。它的工作,但你能解释为什么我必须调用moveToFirst()? – ManishNegi

0

你得到一个错误或只是没有结果? 你确定数据在数据库中吗?

+0

我没有得到任何错误,只是返回0而且是的,我已经从使用DDMS的模拟器中取出数据库(作为副本),然后用调试器输入这部分我的代码,当我用SQLite浏览器打开它时,我可以看到有关它的信息的android_metadata,Groups,Members和Admins表。我可以告诉你,“arg”是在代码的另一部分进行另一个查询后获得的变量,当我正在进行调试时,它给了我一个非空的值 – Andres

0

你用android_metadata表设置你的sqlite数据库吗?请参阅that post,这可能有所帮助。对于我的应用程序,我使用该帖子中的数据库帮助程序类,它的功能就像一个魅力。

+0

是的,它已经完成配置在en_US下,无论如何,我已经看过那个帖子,并且dabase也显示了这个表。 – Andres

相关问题