Android Studio 搜索现有的 sqlite 数据库

Android Studio search existing sqlite db

所以我正在开发一个应用程序,我希望用户在我的数据库中搜索食品,然后 return 使用符合搜索条件的所有食品名称的列表视图进行编辑。我已经创建了 slqite 数据库并将其添加到资产文件夹中。数据库名为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 是干净的。我还没接触过

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

谢谢

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

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

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

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

  • 即id 为 2 和 3 的食物包含食物 mash

您可以 运行 使用 SQLiteDatabase query 方法进行此查询。 query 方法 returns 带有提取数据的 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
        );
    }
}
  • 备注
  • 如果您只在一处定义 table 和列名,问题可能会更少。

    • 因此更改了 onCreate
    • 尽管 SQLite 中的列名是 case-insensitive,但 Cursor 的 getColumnIndex 方法(在主 activity 中使用)是 case-sensitive (IMO a错误).
    • AUTOINCREMENT 并没有按照它的意思去做,而是 INTEGER PRIMARY KEY 本身创建了一个递增的列,添加 AUTOINCREMENT 是一种特殊情况,它确保 id 在间接费用。因此 AUTOINCREMENT 已被删除。
  • 已添加两个额外的方法

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

Activity - 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