我正在尝试从幻灯片bbdd获取数据并在列表视图中显示它,但我有错误。
public class DataBaseHelper extends SQLiteOpenHelper{
private static String DB_PATH = "/data/data/com.rbrlnx.lugares/databases/";
private static final String DATABASE_NAME="db.db";
SQLiteDatabase db;
String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS lugares (" +
" _id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"nombre text," +
"descripcion text,"+
"latitud real," +
"longitud real," +
"foto String);";
/*Primero se crea constructor, funcion onCreate, onUpgrade,Abrir y Cerrar*/
public DataBaseHelper(Context context){
super(context,DATABASE_NAME,null,1);
}
public void onCreate(SQLiteDatabase db){
try {
openDataBase();
db.execSQL(CREATE_TABLE);
} catch (Exception e) {
// handle exception
}
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void openDataBase() throws SQLException{
//Open the database
String myPath = DB_PATH + DATABASE_NAME;
db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
public void close(){
db.close();
}
/*Despues metodos para añadir y obtener datos*/
public long addNombre(String nombre){
ContentValues cv = new ContentValues();
cv.put("nombre", nombre);
return db.insert("lugares", null, cv);
}
public long addDescripcion(String descripcion){
ContentValues cv = new ContentValues();
cv.put("descripcion", descripcion);
return db.insert("lugares", null, cv);
}
public long addLatitud(double latitud){
ContentValues cv = new ContentValues();
cv.put("latitud", latitud);
return db.insert("lugares", null, cv);
}
public long addLongitud(double longitud){
ContentValues cv = new ContentValues();
cv.put("longitud", longitud);
return db.insert("lugares", null, cv);
}
public long addFoto(String foto) {
ContentValues cv = new ContentValues();
cv.put("foto", foto);
return db.insert("lugares", null, cv);
}
public Cursor getNombres(){
SQLiteDatabase db = this.getWritableDatabase();
Cursor respuesta = db.rawQuery("select nombre from lugares", null);
return respuesta;
}
}
和
public class listatab extends ListActivity{
Context context;
ListView listanombres;
DataBaseHelper ayudabbdd;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DataBaseHelper ayudabbdd = new DataBaseHelper(this);
Cursor nombresC;
nombresC = (Cursor) ayudabbdd.getNombres();
startManagingCursor(nombresC);
if(nombresC!=null){
ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.listatab, nombresC, new String[] { "nombre" }, new int[] { R.id.lista });
this.setListAdapter(adapter);
this.getListView().setTextFilterEnabled(true);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (ayudabbdd != null) {
ayudabbdd.close();
}
}
}
并且log cat向我显示了这个错误:
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rbrlnx.lugares/com.rbrlnx.lugares.listatab}: java.lang.IllegalArgumentException: column '_id' does not exist
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1487)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.widget.TabHost.setCurrentTab(TabHost.java:326)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:132)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:456)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.view.View.performClick(View.java:2485)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.view.View$PerformClick.run(View.java:9080)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.os.Handler.handleCallback(Handler.java:587)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.os.Handler.dispatchMessage(Handler.java:92)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.os.Looper.loop(Looper.java:130)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at android.app.ActivityThread.main(ActivityThread.java:3683)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at java.lang.reflect.Method.invokeNative(Native Method)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at java.lang.reflect.Method.invoke(Method.java:507)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): at dalvik.system.NativeStart.main(Native Method)
10-11 00:55:49.930: ERROR/AndroidRuntime(32392): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
答案 0 :(得分:1)
您的openDataBase()
方法非常错误。您不应提供数据库的路径。数据库是为您创建的,并通过onCreate()
方法传递给您。如果您删除openDataBase()
方法但未在onCreate()
中调用,并在this.db = db
中设置onCreate()
,则可能会遇到此错误。
有关在Android中使用数据库的更多帮助,请参阅此Android Database Tutorial。祝你好运!
答案 1 :(得分:1)
我认为也必须选择_id列。
Cursor respuesta = db.rawQuery(“select _id,nombre from lugares”,null);
答案 2 :(得分:0)
如果没有更多信息(我不是Android专家),我怀疑您的表不存在或存在但没有_id
列。您正在使用CREATE TABLE IF NOT EXISTS
,如果表(可能包含不同的列)已存在,则应导致create语句不被执行。
您没有记录您的异常,因此该语句实际上可能会抛出一个被忽略的异常。
答案 3 :(得分:0)
布拉德说你创建表有问题。您应该再次查看database tutorial。
_id不存在问题,因为您没有查询_id列。 使用
Cursor respuesta = db.rawQuery(“select _id,nombre from lugares”,null);
让你的光标。
_id列用于标识和排序项目。如果它不存在,CursorAdapter不知道如何将光标中的项目放在列表中。
如果您的表没有名为_id的列,但您有一些可能称为id的列,则可以选择一个列,但在结果游标中为其指定另一个名称。我不知道正确的语法,但它看起来有点像select(id AS _id)。
答案 4 :(得分:0)
公共类DataBaseHelper {
Context context;
private static final String DATABASE_NAME="lugaresbbdd";
private SQLiteDatabase db; // Referencia al manager.
private final int DB_VERSION = 1; // version
// Nombres para las tablas y campos
private final String TABLE_NAME = "lugares";
private final String TABLE_ROW_ID = "_id";
private final String CNOMBRE = "nombre";
private final String CDESC = "descripcion";
private final String CLAT = "latitud";
private final String CLONG="longitud";
private final String CFOTO="foto";
public DataBaseHelper(Context context)
{
this.context = context;
//Crea o abre la BBDDD
CustomSQLiteOpenHelper helper = new CustomSQLiteOpenHelper(context);
this.db = helper.getWritableDatabase();
}
/*Metodos para añadir datos a la BBDD*/
/**********************************************************************
* Metodos para añadir nombres a la BBDDD
*
* @param nombre valor para nombre
*/
public long addNombre(String nombre){
ContentValues cv = new ContentValues();
cv.put("nombre", nombre);
return db.insert("lugares", null, cv);
}
/**********************************************************************
* Metodos para añadir descrpcipciones a la BBDDD
*
* @param descripcion valor para descripcion
*/
public long addDescripcion(String descripcion){
ContentValues cv = new ContentValues();
cv.put("descripcion", descripcion);
return db.insert("lugares", null, cv);
}
/**********************************************************************
* Metodos para añadir latitudes a la BBDDD
*
* @param latitud valor para campo latitud
*/
public long addLatitud(double latitud){
ContentValues cv = new ContentValues();
cv.put("latitud", latitud);
return db.insert("lugares", null, cv);
}
/**********************************************************************
* Metodos para añadir longitud a la BBDDD
*
* @param longitud valor para campo longitud
*/
public long addLongitud(double longitud){
ContentValues cv = new ContentValues();
cv.put("longitud", longitud);
return db.insert("lugares", null, cv);
}
/**********************************************************************
* Metodos para añadir foto a la BBDDD
*
* @param foto valor para patch de la foto
*/
public long addFoto(String foto) {
ContentValues cv = new ContentValues();
cv.put("foto", foto);
return db.insert("lugares", null, cv);
}
/**********************************************************************
* * Obten todos los nombres
*
*/
public Cursor getNombres(){
Cursor respuesta = db.rawQuery("select "+TABLE_ROW_ID+","+CNOMBRE+" from "+TABLE_NAME, null);
return respuesta;
}
/**********************************************************************
* Borra una fila de la BBDD
*
* @param rowID ID de la BBDD que quiero borrar
*/
public void deleteRow(long rowID)
{
try {db.delete(TABLE_NAME, TABLE_ROW_ID + "=" + rowID, null);}
catch (Exception e)
{
Log.e("DB ERROR", e.toString());
e.printStackTrace();
}
}
/**********************************************************************
* ACTUALIZANDO UN LUGAR DE LA BBDD
* @param rowID EL ID DEL LUGAR QUE QUIERO MODIFICAR
* @param rowNombre nombre nuevo
* @param rowDesc descrpcion nuega
* @param rowLat latitud nueva
* @param rowLong longitud nueva
* @param rowFoto foto nueva
*/
public void updateRow(long rowID, String rowNombre, String rowDesc, Long rowLat, Long rowLong, String rowFoto)
{
// this is a key value pair holder used by android's SQLite functions
ContentValues values = new ContentValues();
values.put(CNOMBRE, rowNombre);
values.put(CDESC, rowDesc);
values.put(CLAT, rowLat);
values.put(CLONG,rowLong);
values.put(CFOTO,rowFoto);
// ask the database object to update the database row of given rowID
try {db.update(TABLE_NAME, values, TABLE_ROW_ID + "=" + rowID, null);}
catch (Exception e)
{
Log.e("DB Error", e.toString());
e.printStackTrace();
}
}
/**
Clase que comprueba si la tabla existe,
Si no existe, se crea
Si existe, se actualiza
Metodo que la cierra al finalizar su uso
*/
private class CustomSQLiteOpenHelper extends SQLiteOpenHelper
{
public CustomSQLiteOpenHelper(Context context)
{
super(context, DATABASE_NAME, null, DB_VERSION);
}
public void onCreate(SQLiteDatabase db)
{
String CREA_TABLA =
"CREATE TABLE " +
TABLE_NAME +
"("+
TABLE_ROW_ID + " integer primary key autoincrement not null," +
CNOMBRE + " TEXT," +
CDESC + " TEXT," +
CLAT + " REAL," +
CLONG + " REAL," +
CFOTO + " STRING" +
");";
db.execSQL(CREA_TABLA);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
//NO HAGAS NADA
}
public void close(){
db.close();
}
}
}
public class listatab extends ListActivity{
Context context;
ListView listanombres;
DataBaseHelper ayudabbdd;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ayudabbdd = new DataBaseHelper(this);
Cursor nombresC;
nombresC = (Cursor) ayudabbdd.getNombres();
startManagingCursor(nombresC);
if(nombresC!=null){
ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.listatab, nombresC, new String[] { "nombre" }, new int[] { R.id.lista });
this.setListAdapter(adapter);
this.getListView().setTextFilterEnabled(true);
}
}
}