2015-09-06 51 views
0

我有一個SQLite數據庫,我在SQLite瀏覽器中創建並通過SQLite資產助手庫導出到我的Android應用程序。此數據庫用於只讀任務,不能升級或修改。從Android中以前創建的SQLite數據庫中搜索並檢索特定數據?

現在我想在特定的列中搜索用戶在TextView中輸入的任何數據,以及在數據與某列值匹配的情況下檢索與其他列對應的所有值。

例如:

  TABLE FRUITS 
_id NAME   URL 
1 apple R.drawable.apple 
2 orange R.drawable.orange 
3 kiwi R.drawable.kiwi 

由於我的應用程序只允許用戶輸入姓名字段,查詢需要的只是名稱的列進行搜索,並且僅當存在於數據庫中檢索URL值,否則將不會返回。

這裏是我的導入數據庫代碼:

import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteQueryBuilder; 

import com.readystatesoftware.sqliteasset.SQLiteAssetHelper; 

public class MyDatabase extends SQLiteAssetHelper { 

    private static final String DATABASE_NAME = "fruitManager"; 
    private static final int DATABASE_VERSION = 1; 

    public MyDatabase(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    public Cursor answerRequest(String request) { 

     SQLiteDatabase db = getReadableDatabase(); 
     SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 

     String sqlTables = "FRUITS"; 

     qb.setTables(sqlTables); 
     String[] sqlSelect = {"0 _id", "NAME", "0 URL"}; 

     Cursor c = qb.query(db, sqlSelect, null, null, 
       null, null, null); 

     return c; 
    } 
} 

,從這裏我提出的要求:

public class Request { 

    private Cursor cursor; 
    private MyDatabase db; 
    String request; 
    String url; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_sqlite_asset_helper); 

     public void onClick(View v) { 
      request = mEdit.getText().toString().toLowerCase(); 
      db = new MyDatabase(this); 
      cursor = db.answerRequest(request); 
      url = cursor.getString(c.getColumnIndex("NAME")); 
      System.out.println("Your request was: " + request + 
           " and has this URL: " + url); 
     } 
    } 

    protected void onDestroy() { 
     super.onDestroy(); 
     cursor.close(); 
     db.close(); 
    } 

不過,需要的代碼加載用於做查詢,但我不在這種情況下確切知道如何實現它們(由於導入的數據庫)。提前致謝。

更新:我有點絕望,所以如果你沒有答案,但知道做任務的替代方案(如使用另一個數據庫處理程序而不是SQLite)我會接受你的建議作爲正確的答案。 唯一的限制是:必須是脫機解決方案(訪問數據庫不需要Internet連接)。

+0

這不工作的部分? – Karakuri

+0

@Karakuri這部分:'遊標c = qb.query(db,sqlSelect,null,null,null,null,null);'不是以正確的方式進行查詢,因爲我認爲指令是不完整的。 – Yulz

回答

0

您當前的查詢看起來是這樣的:你不使用請求字符串

`select 0 _id, NAME, 0 URL from FRUITS` 

通知的任何地方。你也選擇整數立即數0並將其別名到其他列名 - 這似乎沒有任何理由。正如,你的結果會是

_id NAME URL 
0 apple 0 
0 orange 0 
0 kiwi 0 

你想要的是以下幾點:

`select * from FRUITS where NAME = request` 

這是我會怎麼寫呢:

public Cursor answerRequest(String request) { 
    SQLiteDatabase db = getReadableDatabase(); 
    String table = "FRUITS"; 
    String where = "NAME = ?"; 
    String[] whereArgs = {request}; 

    // select * from fruits where name = request 
    return db.query(table, null, where, whereArgs, null, null, null); 
} 

和其他地方,當你想檢索值:

db = new MyDatabase(this); 
Cursor cursor = db.answerRequest(request); 
if (cursor != null) { 
    try { 
     if (cursor.moveToFirst()) { 
      // cursor is not empty, read values here 
      String url = cursor.getString(cursor.getColumnIndex("URL")); 
     } 
    } finally { 
     cursor.close(); 
    } 
} 
+0

你的答案可能是正確的,但我得到這個錯誤:'java.lang.IllegalArgumentException:索引1的綁定值爲空' – Yulz

+0

我的錯誤,我修正了它,這是因爲我的字符串變量「請求」沒有值(空值)。而你的回答是對的,我想說的非常感謝你,我真的很感激:) – Yulz