【问题标题】:Android SQlite get all from databaseAndroid SQlite 从数据库中获取所有信息
【发布时间】:2015-07-29 02:15:10
【问题描述】:

我有一个使用 SQLite 数据库中的项目填充的微调器。我做了如下:

private void loadSpinnerData() {

        baseDatosHistorico db = new baseDatosHistorico(this, "alertasdb.db", null, 1);
        List<String> labels = db.getNomServidor();
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,labels);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(dataAdapter);

    }

getNomServidor() 是在一个类 (baseDatosHistorico) 中声明的方法,它从 SQLiteOpenHelper 扩展而来,其功能是选择保存在 SQLite 数据库中的“n_servidor”列中的服务器名称。这很好用。

当我从微调器中选择一个项目以根据所选项目(WHERE 子句)在 AlertDialog 中显示数据库中的数据时遇到问题。我有以下功能:

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    // On selecting a spinner item
    String label = parent.getItemAtPosition(position).toString();
    baseDatosHistorico bbdd = new baseDatosHistorico(this, "alertasdb.db", null, 1);
    SQLiteDatabase bd = bbdd.getReadableDatabase();   
    Cursor cursor =  bd.rawQuery("SELECT date, description FROM alerts WHERE n_servidor = "+ label + "", null);
    if (cursor.moveToFirst()){
        AlertDialog.Builder dialog = new AlertDialog.Builder(BbddActivity.this);
        dialog.setIcon(android.R.drawable.ic_dialog_info);
        dialog.setTitle(label);
        dialog.setMessage(cursor.getString(0) + " " + cursor.getString(1));
        dialog.setCancelable(false);
        dialog.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id){
                dialog.cancel();
            }
        });
        dialog.show();
    }                       

}

LogCat 说:

07-28 17:20:02.056: E/AndroidRuntime(563): FATAL EXCEPTION: main
07-28 17:20:02.056: E/AndroidRuntime(563): android.database.sqlite.SQLiteException: no such column: hostname1: , while compiling: SELECT fecha, descripcion FROM alertas_email WHERE n_servidor = hostname1
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1356)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1324)
07-28 17:20:02.056: E/AndroidRuntime(563):  at activities.monitorapp.BbddActivity.onItemSelected(BbddActivity.java:57)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.widget.AdapterView.fireOnSelected(AdapterView.java:871)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.widget.AdapterView.access$200(AdapterView.java:42)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:837)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.os.Handler.handleCallback(Handler.java:587)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.os.Handler.dispatchMessage(Handler.java:92)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.os.Looper.loop(Looper.java:123)
07-28 17:20:02.056: E/AndroidRuntime(563):  at android.app.ActivityThread.main(ActivityThread.java:3683)
07-28 17:20:02.056: E/AndroidRuntime(563):  at java.lang.reflect.Method.invokeNative(Native Method)
07-28 17:20:02.056: E/AndroidRuntime(563):  at java.lang.reflect.Method.invoke(Method.java:507)
07-28 17:20:02.056: E/AndroidRuntime(563):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-28 17:20:02.056: E/AndroidRuntime(563):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-28 17:20:02.056: E/AndroidRuntime(563):  at dalvik.system.NativeStart.main(Native Method)

hostname1 存在于数据库中。 ¿ 知道为什么会出现此错误吗?

提前致谢。

【问题讨论】:

  • 尝试将值包装在单个冒号中,例如 ``n_servidor = "+ label + ""
  • hostname1 可能不存在于您的数据库中。可能您认为您添加了一个新列,但忘记更新数据库版本并且从未运行过迁移。
  • 不不不,不要使用ArrayAdapter,你的数据模型是SQLite db所以使用SimpleCursorAdapter
  • 使用 ArrayAdapter 有什么问题?填充微调器对我来说很好
  • 试试SimpleCursorAdapter:你的生活会轻松3倍

标签: android database sqlite spinner android-spinner


【解决方案1】:

在 n_servidor = "+ label + "" after = 之后有一个空格,并且在执行该行时包含在查询中,因此“hostname1”不存在但“hostname1”存在。对于字符串,您必须添加这些单个引用

所以你的查询应该是这样的

 Cursor cursor =  bd.rawQuery("SELECT date, description FROM alerts WHERE n_servidor='"+ label + "'", null);

试试上面的查询希望对你有帮助

【讨论】:

  • @SergioAres Np 你知道问题出在哪里吗?见我更新的答案 匆忙忘记添加解释了。
  • 是的,我了解问题和解决方案。非常感谢。它有效。
猜你喜欢
  • 2020-12-15
  • 2018-08-20
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
相关资源
最近更新 更多