2016-04-03 103 views
0

我想弄清楚如何將我的SQLite數據庫中的表中的信息加載到AutoCompleteTextView中。我搜索了數百個帖子和網站。所有似乎有用的帖子都有不同的創建表的方法,因此使用簡單遊標適配器的語法對我來說沒有任何意義。用SQlite數據庫列填充AutoCompleteTextView

我的程序允許用戶將食物項目輸入到數據庫中。從這個程序的不同部分,我希望用戶能夠將這些食品添加到他們自己的小食品存儲中 - 我已經爲此創建了XML文件。但是,我不知道如何將FoodItems'Name'列返回到我的AutoCompleteTextView - 我已經閱讀了有關Array Adapter的一些信息,但坦率地說,我不知道我在做什麼。

我已經創建了表並且數據庫中有數據。我只會顯示與我的問題相關的代碼,以免超載您。用於寫入數據庫的代碼是:

public static final int DATABASE_VERSION = 1; 
public static final String DATABASE_NAME = "ChangeMe.db"; 
public static final String TABLE_CREATE_FOODS = "CREATE TABLE IF NOT EXISTS FoodItems (Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, Name TEXT, Category TEXT, Calorie NUMERIC, Fat NUMERIC, Carbohydrate NUMERIC)"; 

然後,我必須設置這些食品的方法:

public long SetFoodItems(String name, String category, Float calorie, Float fat, Float carbohydrate) { 
    String query = "SELECT * FROM FoodItems"; 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 

    values.put("Name", name); 
    values.put("Category", category); 
    values.put("Calorie", calorie); 
    values.put("Fat", fat); 
    values.put("Carbohydrate", carbohydrate); 

    long id = db.insert("FoodItems", null, values); 
    return id; 
} 

我也做了一個光標來獲取所有的從記錄FoodItems表:

public Cursor ObtainFoodItems() 
{ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    String Query = "SELECT Name FROM FoodItems"; 
    Cursor CR = db.rawQuery(Query, null); 

    return CR; 
} 

那麼,誰能告訴我如何將此光標返回到autoCompleteTextView?請記住,我是一個Java的完全新手(和一般編碼),所以簡單的建議將不勝感激。

編輯:我能找到的最好的例子是HERE,但他呼籲MyObject填充他的autoTextView並手動加載數據,我不需要這樣做,因爲我的用戶將負責所有數據輸入。

的代碼,我不從該鏈接瞭解的部分是:

// this function is used in CustomAutoCompleteTextChangedListener.java 
public String[] getItemsFromDb(String searchTerm){ 

    // add items on the array dynamically 
    List<MyObject> products = databaseH.read(searchTerm); 
    int rowCount = products.size(); 

    String[] item = new String[rowCount]; 
    int x = 0; 

    for (MyObject record : products) { 

     item[x] = record.objectName; 
     x++; 
    } 

    return item; 
} 

這主要是因爲他的函數來創建該表是我的完全不同:

// creating table 
@Override 
public void onCreate(SQLiteDatabase db) { 
    String sql = ""; 

    sql += "CREATE TABLE " + tableName; 
    sql += " ("; 
    sql += fieldObjectId + " INTEGER PRIMARY KEY AUTOINCREMENT, "; 
    sql += fieldObjectName + " TEXT "; 
    sql += ") "; 

    db.execSQL(sql); 

} 

所以這是我的代碼,我實現了一個AutoCompleteTextView,調用方法從SQLite數據庫獲取數據並循環遍歷記錄,並將數組適配器設置爲AutoCompleteTextView(我認爲)。然而,有些事情是錯誤的,我覺得我錯過了什麼,因爲它沒有做任何事情。

public class AddToPantry extends AppCompatActivity { 
AutoCompleteTextView foodItemsList; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_add_to_pantry); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    Spinner dropdown = (Spinner) findViewById(R.id.editCategory); 
    String[] items = new String[]{"Dairy", "Grain", "Vegetable", "Fruit", "Meat" }; 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, items); 
    dropdown.setAdapter(adapter); 

    Spinner dropdownLoc = (Spinner) findViewById(R.id.editLocation); 
    String[] itemsLoc = new String[]{"Cupboard", "Fridge", "Freezer" }; 
    ArrayAdapter<String> adapterLoc = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, itemsLoc); 
    dropdownLoc.setAdapter(adapterLoc); 

    Button saveButton = (Button) findViewById(R.id.saveIngredient); 
    saveButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      AddItemToPantry(); 
     } 
    }); 

    //Creates the array 
    ArrayList<String> array = new ArrayList<>(); 

    //Implements AutoCompleteTextView 
    foodItemsList = (AutoCompleteTextView) findViewById(R.id.autoFoodName); 

    //Calls method from DH to get all food items 
    DatabaseHandler dbh = new DatabaseHandler(this); 
    Cursor cr = dbh.ObtainFoodItems(); 
    cr.moveToFirst(); 

    while (cr.moveToNext()) { 
     cr.getString(cr.getColumnIndex("Name")); 
    } 

    ArrayAdapter<String> foodItemAdapter = new ArrayAdapter<String>(this, 
      android.R.layout.select_dialog_item, array); 

    foodItemsList.setAdapter(foodItemAdapter); 
} 
+0

「使用簡單遊標適配器的語法對我來說沒有任何意義」 - 如果您編輯問題以包含您不明白的語法,也許我們可以向您解釋它。此外,提供指向您所看到的鏈接有助於防止其他人將此標記爲可能的重複 –

+0

您的HERE鏈接缺少超鏈接。 – halfer

回答

0

首先創建一個array

ArrayList<String> array = new ArrayLIst<>(); 

裏面你讀過光標的方法,循環通過它和那些項目添加到array

while (CR.moveToNext()) { 
     CR.getString(CR.getColumnIndex('NAME')); 
    } 

最後適配器設置爲AutoCompleteTextView像這樣,

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
     android.R.layout.select_dialog_item, array); 
autocompletetextview.setAdapter(adapter); 
+0

我無法得到這個工作;我在下面評論我嘗試插入您的建議,因爲我無法將整個代碼作爲對您答案的迴應。你能告訴我如果我錯過了什麼嗎? – alexpagee

+0

已記錄您的變量「CR」並確認它是否有適當的數據? –

0

考慮到你所使用的AutoCompleteTextView類,最簡單的實現將是:

  1. 實現一個AutoCompleteTextView
  2. 從你的數據庫和循環獲取數據把所有的值數組
  3. 創建一個ArrayAdapter並將其附加到您的AutoCompleteTextView。

就是這樣。

相關問題