【问题标题】:populate AutoCompleteTextView with SQlite database column使用 SQlite 数据库列填充 AutoCompleteTextView
【发布时间】:2016-07-23 02:40:17
【问题描述】:

我试图弄清楚如何将信息从我的 SQLite 数据库中的表加载到 AutoCompleteTextView 中。我已经搜索了数百个帖子和网站。所有看起来有帮助的帖子都有与我使用的不同的创建表的方法,因此使用简单游标适配器的语法对我来说没有任何意义。

我的程序允许用户将食品输入数据库。从这个程序的不同部分,我希望用户能够将这些食物添加到他们自己的小食物存储中——我已经为此创建了 XML 文件。但是,我不知道如何将 FoodItems 的“名称”列返回到我的AutoCompleteTextView - 我读过一些关于阵列适配器的内容,但坦率地说,我不知道我在做什么。

我已经创建了表并且数据库中有数据。我只会显示与我的问题相关的代码,以免使您超载。用于编写数据库的代码是:

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 db 获取数据并遍历记录,并将数组适配器设置为 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);
}

【问题讨论】:

  • “使用简单光标适配器的语法对我来说没有任何意义”——如果您编辑问题以包含您不理解的语法,也许我们可以向您解释.还提供指向您查看过的内容的链接有助于防止其他人将此标记为可能的重复项
  • 您的 HERE 链接缺少超链接。

标签: java sqlite android-studio return simplecursoradapter


【解决方案1】:

首先创建一个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);

【讨论】:

  • 我无法让它工作;我在尝试插入您的建议时在下方发表了评论,因为我无法将整个代码作为对您答案的回应。如果我遗漏了什么,你能告诉我吗?
  • 已记录您的变量CR 并确认它是否有正确的数据?
【解决方案2】:

考虑到您使用的是AutoCompleteTextView 类,最简单的实现是:

  1. 实现 AutoCompleteTextView
  2. 从您的数据库中获取数据并循环以将所有值放入一个数组中
  3. 创建一个 ArrayAdapter 并将其附加到您的 AutoCompleteTextView。

就是这样。

【讨论】:

    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 2023-03-11
    • 2012-04-12
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    相关资源
    最近更新 更多