程序问答   发布时间:2022-05-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了SQLite Android rawQuery 只返回精确值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决sqlite Android rawQuery 只返回精确值?

开发过程中遇到sqlite Android rawQuery 只返回精确值的问题如何解决?下面主要结合日常开发的经验,给出你关于sqlite Android rawQuery 只返回精确值的解决方法建议,希望对你解决sqlite Android rawQuery 只返回精确值有所启发或帮助;

我有一个 SQLite 数据库,其中包含一些食品和饮料及其多语言应用程序的卡路里值。我想在 androID 应用程序中显示它们,但我的查询不会返回值,除非我写下确切的值。

我搜索牛奶时的数据库样本部分:

SQLite Android rawQuery 只返回精确值

public class SearchFragment extends Fragment {

button searchbutton;
EditText editText;
VIEw v;
cursor cursor;
@OverrIDe
public voID onCreate(Bundle savedInstanceStatE) {
    super.onCreate(savedInstanceStatE);
}

@OverrIDe
public VIEw onCreateVIEw(LayoutInflater inflater,VIEwGroup container,Bundle savedInstanceStatE) {
    v = inflater.inflate(R.layout.fragment_search,container,falsE);
    addListenerOnbutton(v);
    return v;
}

private voID addListenerOnbutton(VIEw v) {
    searchbutton = v.findVIEwByID(R.ID.searchfragmenT_Button);
    editText = v.findVIEwByID(R.ID.searchfragment_edittext);
    searchbutton.setonClickListener(new VIEw.onClickListener() {
        @OverrIDe
        public voID onClick(VIEw v) {
            String keyString = editText.getText().toString();
            new Foodquery().execute(keyString);
        }
    });
}

private class Foodquery extends AsyncTask<String,VoID,VoID>{

    @OverrIDe
    protected VoID doInBACkg@R_696_7060@String [] keys) {
        String name_col;
        DIEtApPDAtabaseHelper daDBHelper;
        sqliteDatabase daDB;
        daDBHelper = new DIEtApPDAtabaseHelper(getContext());
        try {
            daDB = daDBHelper.getReadableDatabase();
            if (Locale.getDefault().getLanguage() == "tr")
                name_col = "name_tr";
            else
                name_col = "name_eng";
            String query = "SELECT * FROM food_data WHERE "
                    + name_col + " = ?" ;
            cursor = daDB.rawquery(query,new String[]{"%" + keys[0] + "%"});
            int i = cursor.getCount();
            daDB.close();
        } catch (sqliteException E){
            Log.d("SearchFragment","doInBACkground: " + E);
        }
        return null;
    }
}
}

当我调试“int i = cursor.getCount();”时行,上面的代码不会向游标返回任何值。因此我总是出错。但是不知何故,当我将 rawquery 的 SELEctionArgs 部分从 "%" + keys[0] + "%" 更改为仅 keys[0] 并输入任何行的直接值(例如:Milk (WholE))区分大小写时,我确实得到了1 结果在游标中。 这里是数据库助手类

public class DIEtApPDAtabaseHelper extends sqliteOpenHelper {
private static String db_name = "food_data.db";
private static String DB_PATH = "";
private static final int DB_VERSION = 1;

private sqliteDatabase mDataBase;
private final Context mContext;
private Boolean mNeedupdate = false;

public DIEtApPDAtabaseHelper(Context context) {
    super(context,db_name,null,DB_VERSION);
    if (androID.os.build.VERSION.SDK_INT >= 17)
        DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
    else
        DB_PATH = "/data/data/" + context.getPackagename() + "/databases/";
    Log.d("DIEtpath",DB_PATH);
    this.mContext = context;

    copyDataBase();

    this.getReadableDatabase();
}

public voID updateDataBase() throws IOException {
    if (mNeedupdatE) {
        file dbfile = new file(DB_PATH + db_name);
        if (dbfile.exists())
            dbfile.delete();

        copyDataBase();

        mNeedupdate = false;
    }
}

private Boolean checkDataBase() {
    file dbfile = new file(DB_PATH + db_name);
    return dbfile.exists();
}

private voID copyDataBase() {
    if (!checkDataBase()) {
        this.getReadableDatabase();
        this.close();
        try {
            copyDBfile();
        } catch (IOException mIOException) {
            throw new Error("ErrorcopyingDataBase");
        }
    }
}

private voID copyDBfile() throws IOException {
    inputStream minput = mContext.getAssets().open(db_name);
    //inputStream minput = mContext.getresources().openRawresource(R.raw.info);
    OutputStream mOutput = new fiLeoutputStream(DB_PATH + db_name);
    byte[] mBuffer = new byte[1024];
    int mLength;
    while ((mLength = minput.read(mBuffer)) > 0)
        mOutput.write(mBuffer,mLength);
    mOutput.flush();
    mOutput.close();
    minput.close();
}

public Boolean openDataBase() throws sqlException {
    mDataBase = sqliteDatabase.openDatabase(DB_PATH + db_name,sqliteDatabase.CREATE_IF_NECESSARY);
    return mDataBase != null;
}

@OverrIDe
public synchronized voID close() {
    if (mDataBase != null)
        mDataBase.close();
    super.close();
}

@OverrIDe
public voID onCreate(sqliteDatabase db) {

}

@OverrIDe
public voID onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {
    if (newVersion > oldVersion)
        mNeedupdate = true;
}
}

解决方法

= 运算符进行精确匹配。如果要使用 % 之类的通配符,请使用 LIKE 运算符,如

String query = "SELECT * FROM food_data WHERE "
                + name_col + " LIKE ?" ;

大佬总结

以上是大佬教程为你收集整理的SQLite Android rawQuery 只返回精确值全部内容,希望文章能够帮你解决SQLite Android rawQuery 只返回精确值所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: