【问题标题】:Android Studio search existing sqlite dbAndroid Studio 搜索现有的 sqlite db
【发布时间】:2018-08-24 18:16:05
【问题描述】:

所以我正在开发一个应用程序,我希望用户在我的数据库中搜索一个食物项目,然后返回一个包含所有符合搜索条件的食物名称的列表视图。我已经创建了我的 slqite 数据库并将其添加到 assets 文件夹中。该数据库名为 foodDatabase.db

我已经像这样创建了数据库助手:

package com.example.codebind.databasedemo;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by tom on 15/03/2018.
 */

public class FoodDatabaseHelper extends SQLiteOpenHelper{
    public static final String DATABASE_NAME = "FoodDatabase.db";
    public static final String TABLE_NAME = "dataset";
    public static final String COL_1 = "ID";
    public static final String COL_2 = "Food";
    public static final String COL_3 = "Description";
    public static final String COL_4 = "Protein";
    public static final String COL_5 = "Fat";
    public static final String COL_6 = "Carbohydrate";
    public static final String COL_7 = "Energy";
    public static final String COL_8 = "Starch";
    public static final String COL_9 = "Sugar";
    public static final String COL_10 = "Cholesterol";

    public FoodDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL("create table " + TABLE_NAME +" (ID INTEGER 
PRIMARY KEY AUTOINCREMENT,FOOD TEXT,DESCRIPTION TEXT,PROTEIN BLOB,FAT 
BLOB,CARBOHYDRATE BLOB,ENERGY BLOB,STARCH BLOB,SUGAR BLOB,CHOLESTEROL BLOB) 
");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " +TABLE_NAME);
        onCreate(sqLiteDatabase);
    }
}

目前我的 MainActivity.java 是干净的。我还没碰过。

我正在寻求有关如何添加侦听器的指导,以便当用户输入食物名称时,应用程序将返回 foodDatabase.db 中满足搜索查询的所有食物。

谢谢

【问题讨论】:

    标签: sqlite android-studio android-sqlite sqliteopenhelper


    【解决方案1】:

    您的搜索基础将是基于 FOOD 列的查询(我相信)。

    例如SELECT * FROM dataset WHERE FOOD LIKE '%your_food%'

    例如,假设您的数据库有如下数据(注意只有 food 和 id 列已填充数据):-

    那么查询SELECT * FROM dataset WHERE FOOD LIKE '%mash%' 将导致:-

    • 即id 为 2 和 3 的食物包含食物 ma​​sh

    您可以使用 SQLiteDatabase query 方法运行此查询。 query 方法返回带有提取数据的 Cursor。因此,您的 DatabaseHelper 中的方法可能是:-

    public Cursor getFoodsWithProvidedFood(String provided_food) {
        return this.getWritableDatabase().query(
                TABLE_NAME,
                null,
                COL_2 + " LIKE '%" + provided_food + "%' ",
        null,
                null,
                null,
                null
        );
    }
    

    将其转换为您可以拥有的完整但非常基本的应用程序:-

    数据库助手 - FoodDatabaseHelper.java

    public class FoodDatabaseHelper extends SQLiteOpenHelper {
        public static final String DATABASE_NAME = "FoodDatabase.db";
        public static final String TABLE_NAME = "dataset";
        public static final String COL_1 = "ID";
        public static final String COL_2 = "Food";
        public static final String COL_3 = "Description";
        public static final String COL_4 = "Protein";
        public static final String COL_5 = "Fat";
        public static final String COL_6 = "Carbohydrate";
        public static final String COL_7 = "Energy";
        public static final String COL_8 = "Starch";
        public static final String COL_9 = "Sugar";
        public static final String COL_10 = "Cholesterol";
    
        SQLiteDatabase sqLiteDatabase; //<<<< Added
    
        public FoodDatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, 1);
            sqLiteDatabase = this.getWritableDatabase(); //<<<< Amended
        }
    
        //@Override
        public void onNotRecommendedCreate(SQLiteDatabase sqLiteDatabase) {
            sqLiteDatabase.execSQL("create table " + TABLE_NAME +
                            " (ID INTEGER PRIMARY KEY AUTOINCREMENT," +
                    "FOOD TEXT," +
                    "DESCRIPTION TEXT," +
                    "PROTEIN BLOB," +
                    "FAT BLOB," +
                    "CARBOHYDRATE BLOB," +
                    "ENERGY BLOB," +
                    "STARCH BLOB," +
                    "SUGAR BLOB," +
                    "CHOLESTEROL BLOB)");
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            String crtsql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME +
                    "(" +
                    COL_1 + " INTEGER PRIMARY KEY, " +
                    COL_2 + " TEXT, " +
                    COL_3 + " TEXT, " +
                    COL_4 + " BLOB, " +
                    COL_5 + " BLOB, " +
                    COL_6 + " BLOB, " +
                    COL_7 + " BLOB, " +
                    COL_8 + " BLOB, " +
                    COL_9 + " BLOB, " +
                    COL_10 + " BLOB " +
                    ")";
            db.execSQL(crtsql);
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
            sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " +TABLE_NAME);
            onCreate(sqLiteDatabase);
        }
    
        public void insertFood(
                String food,
                String description,
                byte[] protien,
                byte[] fat,
                byte[] carbohydrate,
                byte[] energy,
                byte[] starch,
                byte[] sugar,
                byte[] cholesterol) {
            ContentValues cv = new ContentValues();
            cv.put(COL_2,food);
            cv.put(COL_3,description);
            cv.put(COL_4,protien);
            cv.put(COL_5,fat);
            cv.put(COL_6,carbohydrate);
            cv.put(COL_7,energy);
            cv.put(COL_8,starch);
            cv.put(COL_9,sugar);
            cv.put(COL_10,cholesterol);
            SQLiteDatabase db = this.getWritableDatabase();
            db.insert(TABLE_NAME,null,cv);
        }
    
        public Cursor getFoodsWithProvidedFood(String provided_food) {
            return this.getWritableDatabase().query(
                    TABLE_NAME,
                    null,
                    COL_2 + " LIKE '%" + provided_food + "%' ",
            null,
                    null,
                    null,
                    null
            );
        }
    }
    
    • 注意事项
    • 如果您只有一个地方可以定义表名和列名,那么问题可能会更少。

      • 因此改变了 onCreate
      • 虽然 SQLite 中的列名不区分大小写,但 Cursor 的 getColumnIndex 方法(在主要活动中使用)区分大小写(IMO 一个错误)
      • AUTOINCREMENT 没有做它所暗示的事情,而是INTEGER PRIMARY KEY 本身创建了一列,添加 AUTOINCREMENT 是一种特殊情况,它确保 id 以开销为代价更大。因此AUTOINCREMENT 已被删除。
    • 添加了两个额外的方法

      • insertFood 将数据插入(添加)到数据集表中。
      • getFoodsWithProvidedFood 如上所述。

    活动 - MainActivity.java

    public class MainActivity extends AppCompatActivity {
    
        FoodDatabaseHelper foodDBHlpr;
        Cursor mCsr;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            foodDBHlpr = new FoodDatabaseHelper(this);
            byte[] dummy = new byte[]{0,1,2,3,4,5,6,7,8,9};
    
            // Add some data oif none exists
            if (DatabaseUtils.queryNumEntries(foodDBHlpr.getWritableDatabase(),FoodDatabaseHelper.TABLE_NAME) < 1) {
                foodDBHlpr.insertFood("Fish and Chips", "The English Seaside meal",
                        dummy, dummy, dummy, dummy, dummy, dummy, dummy);
                foodDBHlpr.insertFood("Bangers and Mash", "Yummy!!",
                        dummy, dummy, dummy, dummy, dummy, dummy, dummy);
                foodDBHlpr.insertFood("Mashed Potatoe", "Boring",
                        dummy, dummy, dummy, dummy, dummy, dummy, dummy);
            }
    
            // get a Cursor with the extracted foods
            mCsr = foodDBHlpr.getFoodsWithProvidedFood("Mash");
            // Loop Through the Cursor
            while (mCsr.moveToNext()) {
                Log.d("FOODFOUND","You found the food called - " + mCsr.getString(mCsr.getColumnIndex(FoodDatabaseHelper.COL_2)));
            }
            if (mCsr.getCount() < 1) {
                Log.d("FOODFOUND","No foods found that match the search criteria.");
            }
            mCsr.close(); //<<<< Should always close Cursors when done with them
        }
    }
    

    日志中的结果:-

    03-15 21:48:21.170 1702-1702/foodsdb.so49307874_foodsdb D/FOODFOUND: You found the food called - Bangers and Mash
    03-15 21:48:21.170 1702-1702/foodsdb.so49307874_foodsdb D/FOODFOUND: You found the food called - Mashed Potatoe
    

    【讨论】:

    • 哇,谢谢伙计,这太棒了,而且解释得很好!早上我会告诉你情况如何。再次感谢!
    • 嗨,迈克,谢谢你,当我运行应用程序时,我将如何使用资产文件夹中的这个数据库来填充 ListView?
    • 现在实际上正在查看其他问题。如果您编辑问题以包含结构(表名和列名),我可以在回复中考虑这些内容。
    • 您在第一个答案中使用的示例表与我创建的表完全相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多