我试图了解这个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个单元格):
现在,如果我添加我的where子句和参数:
cursor = admin.selectLog(DBScheme.Tabla_Calificaciones,
"WHERE " + DBScheme.Columna_IdMateria + "=?",
new String[]{extras.getString("ID")});
查询只产生5条记录(只有5条不良单元格,而不是所有记录......虽然所有行都有相同的主题代码&#34; M001&#34;)
最奇怪的是它甚至不会加载一排表!我已经读过,不建议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
好的,我的查询功能将采用以下方式...我做了两个测试:选择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,而不显示任何其他内容。
现在,我要选择另一件事:
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子句中的列...而且我确定这不应该是那样。