SELECT WHERE失败(SQLITE)

时间:2017-11-22 00:46:20

标签: java android sqlite

我试图了解这个SQLite数据库管理器的行为方式。事实证明,我想做一个简单的选择,以下情况发生在我身上:

我有一个"资格" table(西班牙语中的calificaciones)在加载程序时,我自动插入5行数据(总共30个单元格)的测试,以查看查询的行为:

创建表:

   public static final String CREAR_TABLA_6="CREATE TABLE " + Tabla_Calificaciones + " (" +
            Columna_IdCalificacion + " " + VARCHAR_TYPE + "PRIMARY KEY" + COMM_SEP + " " +
            Columna_IdMateria + " " + VARCHAR_TYPE + COMM_SEP + " " +
            Columna_Categoria + " " + TEXT_TYPE + COMM_SEP + " " +
            Columna_Fecha + " " + DATE_TYPE + COMM_SEP + " " +
            Columna_Descripcion + " " + TEXT_TYPE + COMM_SEP + " " +
            Columna_Calificacion + " " + SMALLINT_TYPE + COMM_SEP + " " +
            "FOREIGN KEY(" + Columna_IdMateria + ") REFERENCES " + Tabla_Materias + "(" + Columna_IdMateria + "))";

DATA INSERT

admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_IdCalificacion,"1");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_IdMateria,"M001");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Categoria,"AP");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Fecha,"11-12-2017");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Descripcion,"Hacer un osito de goma pendejo");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Calificacion,"100");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_IdCalificacion,"2");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_IdMateria,"M001");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Categoria,"EI");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Fecha,"10-12-2017");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Descripcion,"Esto es un texto representando una descripcion " +
            "demasiada larga para colocarlo todo dentro de un textview :)");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Calificacion,"85");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_IdCalificacion,"3");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_IdMateria,"M001");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Categoria,"TG");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Fecha,"09-12-2017");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Descripcion,"Dibujar una valla");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Calificacion,"75");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_IdCalificacion,"4");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_IdMateria,"M001");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Categoria,"EP");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Fecha,"08-12-2017");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Descripcion,"Sabe mas bien");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Calificacion,"66");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_IdCalificacion,"5");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_IdMateria,"M001");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Categoria,"PF");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Fecha,"07-12-2017");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Descripcion,"Ow shet");
    admin.insertar(DBScheme.Tabla_Calificaciones,DBScheme.Columna_Calificacion,"55");

代码有点长,所以我直言不讳。在那里你可以看到我插入数据(它加载完美)。这里我留下了类的onCreate方法的代码:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide();
    setContentView(R.layout.men_detalle_cas);
    context = this;
    Intent intent = getIntent();
    final Bundle extras = intent.getExtras();
    admin = new dbHelper(this);
    int txtSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,5, getResources().getDisplayMetrics());
    spinner = (Spinner)findViewById(R.id.spinSec);
    ArrayAdapter adapter = ArrayAdapter.createFromResource(this,R.array.seccion,android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
    Toast.makeText(getApplicationContext(),extras.getString("ID"),Toast.LENGTH_SHORT).show();
    cursor = admin.selectLog(DBScheme.Tabla_Calificaciones,
            "",
            null);
    Toast.makeText(getApplicationContext(),String.valueOf(cursor.getCount()),Toast.LENGTH_SHORT).show();
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(getApplicationContext(),parent.getSelectedItem().toString(),Toast.LENGTH_SHORT).show();
            if(extras != null) {
                switch (position) {
                    case 0:
                        setTableValues(context,admin.getTableValues(cursor),"AP");
                        break;
                    case 1:
                        setTableValues(context,admin.getTableValues(cursor),"EI");
                        break;
                    case 2:
                        setTableValues(context,admin.getTableValues(cursor),"TG");
                        break;
                    case 3:
                        setTableValues(context,admin.getTableValues(cursor),"EP");
                        break;
                    case 4:
                        setTableValues(context,admin.getTableValues(cursor),"PF");
                        break;
                }
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });
    tabla = (TableLayout)findViewById(R.id.tablaDetalles);
    params = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT,
            TableRow.LayoutParams.WRAP_CONTENT);
    params.setMargins(0,(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,30,getResources().getDisplayMetrics()),0,0);
}

好的,我在这里具体进行查询:

cursor = admin.selectLog(DBScheme.Tabla_Calificaciones,
                "",
                null);

如果我这样离开它,因为它就在这里(没有where子句和参数),该方法抛出表的所有记录(30个单元格):

enter image description here

现在,如果我添加我的where子句和参数:

cursor = admin.selectLog(DBScheme.Tabla_Calificaciones,
            "WHERE " + DBScheme.Columna_IdMateria + "=?",
            new String[]{extras.getString("ID")});

查询只产生5条记录(只有5条不良单元格,而不是所有记录......虽然所有行都有相同的主题代码&#34; M001&#34;)

enter image description here

最奇怪的是它甚至不会加载一排表!我已经读过,不建议SQL注入主题使用 rawQuery 。但说实话,这是一个绝望的举动......因为同样查询它也不起作用。

这是我使用我的DBHelper类的方法:

   public void insertar(String table, String column, String value){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(column, value);
    db.insert(table,null,values);
}

 public Cursor selectLog(String tabla,String where,String[]args){
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor;
    if(args != null)
       cursor = db.rawQuery("SELECT * FROM "+ tabla + " " + where ,args);
    else
       cursor = db.rawQuery("SELECT * FROM "+ tabla,null);
    return cursor;
}

public Cursor selectWhere(String table,String[]columns, String whereCols, String[]whereArgs){
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(table,columns,whereCols,whereArgs,null,null,null);
    return cursor;
}

如何解决这个问题......我很困惑。 Cursor与Datatable或resultSet不同:/

修改 我使用查询功能进行了一些测试,发生了这种情况:

方法查询我是否错了:https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

  • 第一个参数是表的名称。
  • 第二个参数是我要选择的列。
  • 第三个参数是Where子句。
  • 第四个参数是where子句的选择参数。
  • 最后3个参数适用于 GroupBy,Having和OrderBy

好的,我的查询功能将采用以下方式...我做了两个测试:选择4个列,其中IdSubject(IdMateria)等于&#34; M001&#34;

cursor = admin.selectWhere(DBScheme.Tabla_Calificaciones,
                new String[]{DBScheme.Columna_IdMateria,
                DBScheme.Columna_Fecha,
                DBScheme.Columna_Descripcion,
                DBScheme.Columna_Calificacion},
                DBScheme.Columna_IdMateria + "=?",
                new String[]{extras.getString("ID")});

在查看结果时,它只显示主题的ID,而不显示任何其他内容。

enter image description here

enter image description here

现在,我要选择另一件事:

 cursor = admin.selectWhere(DBScheme.Tabla_Calificaciones,
            new String[]{DBScheme.Columna_IdMateria,
            DBScheme.Columna_Fecha,
            DBScheme.Columna_Descripcion,
            DBScheme.Columna_Calificacion},
            DBScheme.Columna_Descripcion + "=?",
            new String[]{"Dibujar una valla"});

结果是一样的。就像,该方法只选择WHERE子句中的列...而且我确定这不应该是那样。

enter image description here

0 个答案:

没有答案