2010-10-20 80 views
1

我有一個名爲person的表,它包含兩個字段,name(TEXT)和age(INT)。我想按字母順序對這個表進行排序,但我似乎可以使sql語句正常工作。我正在使用的聲明是:android訂單sqlite表

SELECT name FROM person ORDER BY name; 

我已經嘗試了三種不同的編碼版本,其中沒有一個工作。

db.rawQuery("SELECT name FROM person ORDER BY name;", null); 
db.execSQL("SELECT name FROM person ORDER BY name;", null); 
db.execSQL("SELECT name FROM person ORDER BY name;"); 

rawQuery完全沒有,LogCat中沒有顯示任何消息。

java.lang.IllegalArgumentException: Empty bindArgs 

與第二execsql崩潰:第一execSQL與崩潰

android.database.sqlite.SQLiteException: unknown error: Queries cannot be performed using execSQL(), use query() instead. 

我使用查詢()也試過,但我不能讓元首或它的尾巴。請幫助。

回答

3

嘗試:

db.query("person", new String[] {"name"}, null, null, null, null, "name"); 

按照參考:

public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) 

例如,如果你想既姓名和年齡,你可以使用:

db.query("person", new String[] {"name", "age"}, null, null, null, null, "name"); 

如果您想選擇只有在他們可以使用的「木質」名稱:

db.query("person", new String[] {"name"}, "name=?", new String[] { "woody" }, null, null, "name"); 

對於處理結果,你可以做到以下幾點:

Cursor c = db.query("person", new String[] {"name", "age"}, null, null, null, null, "name"); 

startManagingCursor(c); 
int nameColumn = c.getColumnIndex("name"); 
int ageColumn = c.getColumnIndex("age"); 
c.moveToFirst()) 
do 
{ 
    // Perform Logic 
    Log.i('TEST INFO', 'Name: '.c.getString(nameColumn).' Age: '.c.getInt(ageColumn)); 
} 
while (c.moveToNext()); 

修訂爲每評論:我不太知道你爲什麼會要重新排序在數據庫中的數據,但下面的函數應做你想做的事情,你可能需要修改套件,它會得到所有條目(有序),創建臨時表,添加條目,刪除實際表並重新命名臨時表成爲主表:

這樣做是非常耗資源 - 使用正確佈局的SQL SELECT語句來訂購結果從DB收集的將會少得多。

private void orderDB() 
{ 
    Cursor c = db.query("person", new String[] {"name", "age"}, null, null, null, null, "name"); 
    startManagingCursor(c); 

    //Create a temp table: 
    db.execSQL("CREATE TABLE IF NOT EXISTS tmp_person (_id integer primary key autoincrement, " 
     + "name text not null, " 
     + "age integer);"); 

    // Get column ID's 
    int nameColumn = c.getColumnIndex("name"); 
    int ageColumn = c.getColumnIndex("age"); 

    // Iterate through all entries 
    c.moveToFirst(); 
    do 
    { 
     if (c.getCount() >0) 
     { 
      ContentValues orderedValues = new ContentValues(); 
      orderedValues.put("name", c.getString(nameColumn)); 
      orderedValues.put("age", c.getInt(ageColumn)); 
      try 
      { 
       // Insert the entry into a temp table 
       db.insert("tmp_person", null, orderedValues); 
      } 
      catch (SQLException e) 
      { 
       Log.e("TEST INFO", e.toString()); 
      } 
     } 
    } 
    while (c.moveToNext()); 

    // Drop the current person table: 
    db.execSQL("DROP TABLE IF EXISTS person"); 

    // Rename the temp table to person: 
    db.execSQL("ALTER TABLE tmp_person RENAME TO person"); 
} 
+0

它的工作原理有點更安全。我可以在屏幕上按順序打印名稱,但數據庫不會更新。當我關閉並重新打開應用程序時,數據庫又回到原來的狀態。 – Woody 2010-10-20 18:30:22

+0

@Woody數據庫不會改變它的結構 - SELECT語句只會向數據庫請求數據,並且通過添加ORDER BY只會在從數據庫中獲取結果時對結果進行排序。數據庫在添加時爲每個條目存儲一個密鑰,該密鑰保持數據庫的順序。爲什麼你需要重新排序數據庫?AFAIK唯一的方法是執行選擇,然後清空表格,然後按順序重新輸入信息。 – Scoobler 2010-10-20 18:43:38

+0

我只需要將數據庫重新排序,我該怎麼做? – Woody 2010-10-20 18:51:23

1

當我讀到這裏(rawQuery),該rawQuery()方法不接受與SQL字符串;終止。

你的SQL字符串沒有錯。只要刪除;一切都會好起來的。

但正如我已閱讀here,使用db.query()將是你的數據庫