Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android sql查询出现问题…“;“没有这样的栏吗?”;?_Java_Android_Sql - Fatal编程技术网

Java android sql查询出现问题…“;“没有这样的栏吗?”;?

Java android sql查询出现问题…“;“没有这样的栏吗?”;?,java,android,sql,Java,Android,Sql,我想使用SQL数据库来存储游戏记录。事实上,我对SQL一无所知。我有一个“记录”类,它应该管理记录的输入和输出。此外,我还有一个类SQLDatabaseHelper,它提供SQL数据库 我的问题是以下几行: crsRecord = sqliteDatabase.rawQuery(QUERY_GET_RECORD + category, null); 我总是得到错误“没有这样的列:SYS103” “SYS103”是一个类别的名称。我不知道为什么它可以阅读。你知道吗 SQL表创建: CREATE

我想使用SQL数据库来存储游戏记录。事实上,我对SQL一无所知。我有一个“记录”类,它应该管理记录的输入和输出。此外,我还有一个类SQLDatabaseHelper,它提供SQL数据库

我的问题是以下几行:

crsRecord = sqliteDatabase.rawQuery(QUERY_GET_RECORD + category, null);
我总是得到错误“没有这样的列:SYS103” “SYS103”是一个类别的名称。我不知道为什么它可以阅读。你知道吗

SQL表创建:

CREATE TABLE records (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            category VARCHAR(30) NOT NULL,
            displaytime VARCHAR(12) NOT NULL,
            recordtime VARCHAR(10) NOT NULL);
我想写作是有效的,只是阅读是无效的

public class Records {
            private SQLiteOpenHelper sqliteOpenHelper;
            private SQLiteDatabase sqliteDatabase;

            private static final String INSERT_NEW_RECORD = "insert into records(category, displayrecord, timerecord) values(";
            private static final String QUERY_GET_RECORD = "SELECT * FROM  records WHERE category = ";

            public Records(Context context){
                sqliteOpenHelper = new SQLDatabaseHelper(context);
                sqliteDatabase = sqliteOpenHelper.getWritableDatabase();
            }

            public void addRecord(String category, String displaytime, String timerecord){
                ContentValues data = new ContentValues();

                data.put("category", category);
                data.put("displaytime", displaytime);
                data.put("recordtime", timerecord);

                sqliteDatabase.insert("records", null, data);
        //      sqliteDatabase.execSQL(INSERT_NEW_RECORD + category + ", " + strTime + ", " + dblTime + ");");
            }

            public String[] getRecord(String category){
                String[] record = new String[3];
                Cursor crsRecord;
                try{
                    crsRecord = sqliteDatabase.rawQuery(QUERY_GET_RECORD + category, null);
                }catch(SQLiteException e){
                    Log.d("database", e.getMessage());
                    String[] nullRecord = {category, "00:00.0", "0"};
                    return nullRecord;
                }

                int i=0;


                while(crsRecord.moveToNext()){
                    record[i] = crsRecord.getString(0);
                    i++;
                }

                return record;

            }
        }

    public class SQLDatabaseHelper extends SQLiteOpenHelper {
        private Context context;

        public SQLDatabaseHelper(Context context){
            super(
                context,
                context.getResources().getString(R.string.dbname),
                null,
                Integer.parseInt(context.getResources().getString(R.string.version)));
             this.context=context;
         }

        @Override
        public void onCreate(SQLiteDatabase db) {
            for(String sql : context.getResources().getStringArray(R.array.create)){
                db.execSQL(sql);
            }
            Log.d("Database", "creat succesfully");
         }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        }
    }
我的方法是从数据库中获取数据,但出于某种原因,columnIndex始终为-1:

public String[] getRecord(String category){
    String[] record = new String[3];
    Cursor crsRecord;

        crsRecord = sqliteDatabase.rawQuery(QUERY_GET_RECORD, new String[]{ category } );

    int i=0;
    crsRecord.moveToFirst();
    while(!crsRecord.isAfterLast()){

        // Instead of using an int literal to get the colum index,
        // use the getColumnIndex method
        int index = crsRecord.getColumnIndex(category);
        if (index == -1) {
            String[] nullRecord = {category, "00:00.0", "0"};
            return nullRecord;
        }
        else {
            record[i] = crsRecord.getString(index);
            i++;
        }

        crsRecord.moveToNext();
    }



    while(crsRecord.moveToNext()){
        record[i] = crsRecord.getString(0);
        i++;
    }

    return record;

}

您需要转义参数

按原样,您的代码执行查询:

SELECT * FROM  records WHERE category = SYS103
这不是有效的SQL。应该是这样的:

SELECT * FROM  records WHERE category = 'SYS103'
你需要避开撇号。您最好依靠
rawQuery
来转义参数:

private static final String QUERY_GET_RECORD 
                            = "SELECT * FROM  records WHERE category = ?";


您是否注意到:
private static final String INSERT\u NEW\u RECORD=“INSERT into records(category,displayrecord,timerecord)值(”
?此处指定的列名与创建表的列名相比?以前使用过INSERT_NEW_记录。现在它是一条注释。但我尝试再次使用它,并更改了INSERT_NEW_记录行,但唯一的区别是,我遇到了另一个错误:android.database.sqlite.SQLiteException:near“:12”:语法错误(代码1):,编译时:插入记录(类别,显示记录,记录时间)值(SYS103,00:12.85819);谢谢你…现在我在“插入”行中有另一个错误。你知道吗?如果你想使用rawQuery,也可以这样做:
rawQuery(“插入记录(类别,显示时间,记录时间)值(?,,?)”,新字符串[]{cat,dt,rt});
您最好使用
insert
。现在它可以正常工作,但我无法从数据库中获取数据。我已更新了上面的条目。您实际上没有访问getRecord中的光标。添加类似
if(crsRecord.moveToFirst()){返回新字符串{}{crsRecord.getString(0),crsRecord.getString(1),crsRecord.getString(2)};}else{…return null record…}
Oh yea…根据调试器,我访问光标。查看我附加的新代码。但问题是我总是得到“getColumnIndex”=-1…这意味着列不存在,但应该存在,因为我之前添加了它。
crsRecord = 
    sqliteDatabase.rawQuery(QUERY_GET_RECORD, new String[]{ category } );