2014-03-01 103 views
4

我想从我创建的数据库中获取一个随机行,但我无法弄清楚如何去做。从SQLite数据库Android获得随机行Android SDK

我发现了几个问题和答案在这里StackOverflow上哪说我应该使用这样的:

Cursor cursor = this.db.query("mainTable Order BY RANDOM() LIMIT 1", 
      new String[] { "*" }, null, null, null, null, null); 

不过,我觉得我有某种其他的数据库,因为它返回一个错误,不知道的方法“查询” 。

这是数据库的代码,我使用:

package com.example.database; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DBAdapter{ 

    private static final String TAG = "DBAdapter"; 

    public static final String KEY_ROWID = "_id"; 
    public static final int COL_ROWID = 0; 

    public static final String KEY_PIC = "picture"; 
    public static final String KEY_ANS = "answer"; 

    public static final int COL_PIC = 1; 
    public static final int COL_ANS = 2; 


    public static final String[] ALL_KEYS = new String[] {KEY_ROWID, KEY_PIC, KEY_ANS}; 

    public static final String DATABASE_NAME = "MyDb"; 
    public static final String DATABASE_TABLE = "mainTable"; 
    public static final int DATABASE_VERSION = 2; 

    private static final String DATABASE_CREATE_SQL = 
      "create table " + DATABASE_TABLE 
      + " (" + KEY_ROWID + " integer primary key autoincrement, " 
      + KEY_PIC + " integer not null, " 
      + KEY_ANS + " text not null" 
      + ");"; 

    private final Context context; 

    private DatabaseHelper myDBHelper; 
    private SQLiteDatabase db; 

    public GevaarherkenningDBHelper(Context ctx) { 
     this.context = ctx; 
     myDBHelper = new DatabaseHelper(context); 
    } 

    public GevaarherkenningDBHelper open() { 
     db = myDBHelper.getWritableDatabase(); 
     return this; 
    } 

    public void close() { 
     myDBHelper.close(); 
    } 

    public long insertRow(int pic, String answer) { 
     ContentValues initialValues = new ContentValues(); 

     initialValues.put(KEY_PIC, pic); 
     initialValues.put(KEY_ANS, answer); 

     return db.insert(DATABASE_TABLE, null, initialValues); 
    } 

    public boolean deleteRow(long rowId) { 
     String where = KEY_ROWID + "=" + rowId; 
     return db.delete(DATABASE_TABLE, where, null) != 0; 
    } 

    public void deleteAll() { 
     Cursor c = getAllRows(); 
     long rowId = c.getColumnIndexOrThrow(KEY_ROWID); 
     if (c.moveToFirst()) { 
      do { 
       deleteRow(c.getLong((int) rowId));    
      } while (c.moveToNext()); 
     } 
     c.close(); 
    } 

    public Cursor getAllRows() { 
     String where = null; 
     Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, 
          where, null, null, null, null, null); 
     if (c != null) { 
      c.moveToFirst(); 
     } 
     return c; 
    } 

    public Cursor getRow(long rowId) { 
     String where = KEY_ROWID + "=" + rowId; 
     Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, 
         where, null, null, null, null, null); 
     if (c != null) { 
      c.moveToFirst(); 
     } 
     return c; 
    } 

    public Cursor getRowRandom(String rowId) { 
     Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, 
         null, null, null, null, "RANDOM()", "1"); 
     if (c != null) { 
      c.moveToFirst(); 
     } 
     return c; 
    } 

    public boolean updateRow(long rowId, int pic, String answer) { 
     String where = KEY_ROWID + "=" + rowId; 

     ContentValues newValues = new ContentValues(); 
     newValues.put(KEY_PIC, pic); 

     newValues.put(KEY_ANS, answer); 

     return db.update(DATABASE_TABLE, newValues, where, null) != 0; 
    } 

    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
     DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase _db) { 
      _db.execSQL(DATABASE_CREATE_SQL);   
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) { 
      Log.w(TAG, "Upgrading application's database from version " + oldVersion 
        + " to " + newVersion + ", which will destroy all old data!"); 

      _db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 

      onCreate(_db); 
     } 
    } 
} 

有没有一种方法,我可以实现“query'法在此数据库类,如果是这样,如何?还是有人建议使用其他数据库代码?

编辑:

我可能还没有问正确的问题在这里...我的问题是,使用任何在该点的答案给出的方法,如

db.rawQuery("SELECT * FROM mainTable ORDER BY RANDOM() LIMIT 1", null); 

返回错误,它是未定义的。

那么我需要在数据库适配器代码中更改以正确使用此代码?

回答

7

尝试删除this并确保您的db是SQLiteDatabase。您也可以通过以下方式获得随机行:

db.rawQuery("SELECT * FROM mainTable ORDER BY RANDOM() LIMIT 1", null); 

顺便说一句,你已经在使用正确的查询代码getRowRandom方法。

+0

是的,我补充说,我只是试图忘记从代码中删除它。然而,它不起作用... – Thijs93H

+0

你确定你创建了一个'GevaarherkenningDBHelper'的新实例,名为'open()',之后执行你的查询吗? – nikis

+0

工作!愚蠢的我忘了关闭活动中的光标... -_- – Thijs93H

0

query()SQLiteDatabase上的方法。您的DBAdapter课程中已经使用了query(),例如您的getAllRows()方法。