查询可以在SQLite浏览器上运行,但不能在Android SQlLite中运行

查询可以在SQLite浏览器上运行,但不能在Android SQlLite中运行,android,string,sqlite,Android,String,Sqlite,我写这封信是因为我试图找出如何在Android上运行此查询,我知道sintaxis是可以的,因为我以前在SQLite浏览器上尝试过,但我不知道为什么它在Android上没有给我任何结果,这是我在Android上使用的代码: public long getAdminOrMemberOrGroupID (String arg, char option){ Cursor result = null; String[] selectionArgs = new String[] {

我写这封信是因为我试图找出如何在Android上运行此查询,我知道sintaxis是可以的,因为我以前在SQLite浏览器上尝试过,但我不知道为什么它在Android上没有给我任何结果,这是我在Android上使用的代码:

    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将数据库文件拉到我的pc上,并尝试在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;
}

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

您得到的是错误还是没有结果?
您确定数据在数据库中吗?

您是否使用android\u元数据表设置了sqlite数据库?看,这可能会有帮助。对于我的应用程序,我使用了那篇文章中的database helper类,它工作起来很有魅力。

你用android\u元数据表设置过你的sqlite数据库吗?看,这可能会有帮助。对于我的应用程序,我使用的是那篇文章中的database helper类,它工作得非常好。

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

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

我将在Android中调试应用程序,并检查传入方法的所有内容是否正确,以及构造的查询是否符合您在SQLite浏览器中的预期/测试。您在何处使用SQLite浏览器在Android内部或Android外部创建/定义了表?你能发布你的表defs吗?我当然已经发布了,这是我发布前一直在做的事情,代码已经在查询类型下进行了测试(使用调试器),我在SQLite Brower上尝试了调试器给出的sql语句,它在该应用程序上给出了所需的结果。我将在Android中调试该应用程序,并检查传入该方法的所有内容是否正确,以及构造的查询是否符合您在SQLite Browser中的预期/测试。您在哪里创建/定义了表,使用SQLite浏览器在Android内部还是外部?你能发布你的表defs吗?我当然已经发布了,这是我在发布之前已经做了一段时间的事情,代码已经在查询类型下进行了测试(使用调试器),我在SQLite Brower上尝试了调试器给出的sql语句,它在已经完成的应用程序上给出了期望的结果,它是在en_US下配置的,反正我已经看到了那个帖子,dabase也显示了那个表。是的,完成了,它是在en_US下配置的,反正我已经看到了那个帖子,dabase也显示了那个表。我没有得到任何错误,只是返回一个0。是的,在使用调试器进入我的代码的这一部分之前,我使用DDMS从emulator中提取了数据库(作为副本),当我使用SQLite浏览器打开它时,我可以看到android_元数据、组、成员和管理员表,以及其中的信息。我还可以告诉你,“arg”是一个变量,它是在代码的另一部分中执行另一个查询后获得的,当我进行调试时,它给我一个不是null的值,我没有得到任何错误,只是返回一个0。是的,在使用调试器进入我的代码的这一部分之前,我使用DDMS从emulator中提取了数据库(作为副本),当我使用SQLite浏览器打开它时,我可以看到android_元数据、组、成员和管理员表,以及其中的信息。我还可以告诉您,“arg”是一个变量,它是在代码的另一部分中执行另一个查询后获得的,当我进行调试时,它会给我一个不是NullDeCalion的值。Calion是正确的-在
rawQuery
的文档中,它说光标返回到第一行之前。因此,如果您将
if(result.isFirst())
替换为
if(result.moveToFirst())
,您的问题应该会得到解决。谢谢@PresidentEvil。它起作用了,但是你能解释一下为什么我必须调用moveToFirst()?@ManishNegi在你与光标交互之前,它没有指向任何特定的行,你需要将它移动到一个条目。最常见的用例是从第一个结果开始,因此
moveToFirst()
.Deucalion是正确的-在
rawQuery
的文档中,它指出光标返回到第一行之前。因此,如果您将
if(result.isFirst())
替换为
if(result.moveToFirst())
,您的问题应该会得到解决。谢谢@PresidentEvil。它起作用了,但是你能解释一下为什么我必须调用moveToFirst()?@ManishNegi在你与光标交互之前,它没有指向任何特定的行,你需要将它移动到一个条目。最常见的用例是从第一个结果开始,因此
moveToFirst()