如何显示在ListView android的数据库 [英] how to display the database in a listview android
问题描述
这个问题是有名的,但大家总是说去看看这个记事本教程。
这会有所帮助,但它并不能帮助那么多,当你被卡住了。
所以我有,我已经在Android上创建这个数据库,我想在一个列表视图中显示它,我做了教程,但我还是不明白,为什么我不能让它在我的项目上工作,因此,如果是谁的人可以帮忙,请出示一下吧!
这是我的code
公共类MyFridge扩展ListActivity {私人DBAdapter分贝;
公共无效的onCreate(捆绑savedInstanceState)
{
super.onCreate(savedInstanceState);
的setContentView(R.layout.notepad_list);
DB =新DBAdapter(本);
db.open();
fillData();
@覆盖
公共布尔onCreateOptionsMenu(菜单菜单)
{
super.onCreateOptionsMenu(菜单);
CreateMenu(菜单);
返回true;
}@覆盖
公共布尔onOptionsItemSelected(菜单项项)
{ 开关(item.getItemId())
{
情况下0: 意图F =新意图(MyFridge.this,Addform.class);
startActivity(F); 返回true; 情况1: 意图R =新意图(MyFridge.this,MyRecipes.class);
startActivity(R);
返回true; 默认:
返回super.onOptionsItemSelected(项目); }
}私人无效CreateMenu(菜单菜单)
{
菜单项mnu1 = menu.add(0,0,0,添加成分);
{
mnu1.setAlphabeticShortcut('A'); //更改与此项目相关的字母快捷键。
mnu1.setIcon(R.drawable.ic_launcher); } 菜单项mnu2 = menu.add(0,1,1,删除成分);
{
mnu2.setAlphabeticShortcut('B'); //更改与此项目相关的字母快捷键。
mnu2.setIcon(R.drawable.ic_launcher);
}
} 私人无效fillData(){
//获取所有的音符从数据库中,并创建项目列表
光标C = db.getAllCars();
startManagingCursor(C); 的String [] =由新的String [] {} DBAdapter.KEY_TYPE;
INT []为= INT新[] {} R.id.text1; //现在创建一个阵列适配器,并设置它使用我们一行中显示
SimpleCursorAdapter指出=
新SimpleCursorAdapter(这一点,R.layout.notes_row,C,从,到);
setListAdapter(注);
}
这是我的数据库:
公共类DBAdapter {
公共静态最后弦乐KEY_ROWID =_id;
公共静态最后弦乐为key_type =类型;
公共静态最后弦乐KEY_WEIGHT =减肥;
公共静态最后弦乐KEY_EXP =到期日; 私有静态最后弦乐TAG =DBAdapter; 私有静态最后弦乐DATABASE_NAME =MYDB;
私有静态最后弦乐DATABASE_TABLE =冰箱;
私有静态最终诠释DATABASE_VERSION = 2; 私有静态最后弦乐DATABASE_CREATE =
CREATE TABLE冰箱(_id整数主键自动增量
+文本类型不为null,整数重量不为空,EXP整数NOT NULL);;
// CHECK(P_ID大于0) 私人最终上下文的背景下; 私人DatabaseHelper DBHelper;
私人SQLiteDatabase分贝; 公共DBAdapter(上下文CTX)
{
this.context = CTX;
//它让新创建的对象理解什么已经持续。
//通常你调用它来获取关于你的程序的其他部分信息
DBHelper =新DatabaseHelper(背景);
} 私有静态类DatabaseHelper扩展SQLiteOpenHelper
{
DatabaseHelper(上下文的背景下)
{
超(背景下,DATABASE_NAME,空,DATABASE_VERSION); //调用父类的上下文
} @覆盖
公共无效的onCreate(SQLiteDatabase DB)
{
尝试{
db.execSQL(DATABASE_CREATE);
}赶上(的SQLException E){
e.printStackTrace();
}
} @覆盖
公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释NEWVERSION)//如果操作系统或应用程序版本改变使用这种方法
{
Log.w(TAG,从版本升级数据库+ oldVersion +到
+ NEWVERSION +,这将摧毁所有旧数据);
db.execSQL(DROP TABLE IF EXISTS汽车);
的onCreate(DB);
}
} // ---打开数据库---
公共DBAdapter的open()抛出的SQLException
{
DB = DBHelper.getWritableDatabase();
返回此;
} // ---关闭数据库---
公共无效的close()
{
DBHelper.close();
} // ---插入一个接触到数据库---
众长insertCar(字符串类型,INT重量,诠释EXP)
{
ContentValues initialValues =新ContentValues();
initialValues.put(key_type的,类型);
initialValues.put(KEY_WEIGHT,重量);
initialValues.put(KEY_EXP,EXP); 返回db.insert(DATABASE_TABLE,空,initialValues);
} // ---删除特定联系人---
公共布尔deleteCar(长ROWID)
{
返回db.delete(DATABASE_TABLE,KEY_ROWID +=+ ROWID,NULL)> 0;
} // ---检索所有联系人---
公共光标getAllCars()
{
返回db.query(DATABASE_TABLE,新的String [] {KEY_ROWID,为key_type,
KEY_WEIGHT,KEY_EXP},NULL,NULL,NULL,NULL,NULL);
} / *
*检索特定的汽车
*
* /
公共光标getCar(字符串搜索字符串)//抛出的SQLException
{
光标mCursor =
db.query(真,DATABASE_TABLE,新的String [] {KEY_ROWID,
为key_type,KEY_WEIGHT,KEY_EXP},为key_type +=+'+搜索字符串+'+或+ KEY_ROWID +=+'+搜索字符串+'+或+ KEY_EXP += +'+搜索字符串+'+或+ KEY_WEIGHT +=+'+搜索字符串+',空,
NULL,NULL,NULL,NULL); 返回mCursor;
}
// ---更新联系人---
公共布尔updateCar(长ROWID,字符串类型,INT重量,诠释EXP)
{
ContentValues ARGS =新ContentValues();
args.put(key_type的,类型);
args.put(KEY_WEIGHT,重量);
args.put(KEY_EXP,EXP); 返回db.update(DATABASE_TABLE,ARGS,KEY_ROWID +=+ ROWID,NULL)> 0;
}
}
logcat的信息。
04-09 18:14:47.128:D / TextLayoutCache(23297):使用调试级别:0 - 调试启用:0
04-09 18:14:47.173:D /剪贴板(23297):隐藏剪贴板在对话框输入出发:由别人完成了...!
04-09 18:14:49.113:I / SqliteDatabaseCpp(23297):sqlite的返回:错误code = 1,味精=没有这样的表:冰箱,DB = XXX
04-09 18:14:49.113:D / AndroidRuntime(23297):关闭VM
04-09 18:14:49.118:W / dalvikvm(23297):主题ID = 1:螺纹未捕获的异常(组= 0x40c281f8)退出
04-09 18:14:49.123:E / AndroidRuntime(23297):致命异常:主要
04-09 18:14:49.123:E / AndroidRuntime(23297):了java.lang.RuntimeException:无法启动活动ComponentInfo {wijayaratnam.sutharsun.mobilefridge / wijayaratnam.sutharsun.mobilefridge.MyFridge}:android.database.sqlite.SQLiteException :没有这样的表:冰箱:,编译时:选择_id,种类,重量,到期日从冰箱
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.app.ActivityThread.access $ 600(ActivityThread.java:127)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1159)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.os.Handler.dispatchMessage(Handler.java:99)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.os.Looper.loop(Looper.java:137)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.app.ActivityThread.main(ActivityThread.java:4507)
04-09 18:14:49.123:E / AndroidRuntime(23297):在java.lang.reflect.Method.invokeNative(本机方法)
04-09 18:14:49.123:E / AndroidRuntime(23297):在java.lang.reflect.Method.invoke(Method.java:511)
04-09 18:14:49.123:E / AndroidRuntime(23297):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:790)
04-09 18:14:49.123:E / AndroidRuntime(23297):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
04-09 18:14:49.123:E / AndroidRuntime(23297):在dalvik.system.NativeStart.main(本机方法)
04-09 18:14:49.123:E / AndroidRuntime(23297):android.database.sqlite.SQLiteException:没有这样的表:由造成冰箱:,编译时:选择_id,种类,重量,到期日从冰箱
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.database.sqlite.SQLiteCompiledSql.native_compile(本机方法)
。04-09 18:14:49.123:E / AndroidRuntime(23297):在android.database.sqlite.SQLiteCompiledSql<&初始化GT;(SQLiteCompiledSql.java:68)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
。04-09 18:14:49.123:E / AndroidRuntime(23297):在android.database.sqlite.SQLiteProgram<&初始化GT;(SQLiteProgram.java:127)
。04-09 18:14:49.123:E / AndroidRuntime(23297):在android.database.sqlite.SQLiteProgram<&初始化GT;(SQLiteProgram.java:94)
。04-09 18:14:49.123:E / AndroidRuntime(23297):在android.database.sqlite.SQLiteQuery<&初始化GT;(SQLiteQuery.java:53)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1690)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1575)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1531)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1611)
04-09 18:14:49.123:E / AndroidRuntime(23297):在wijayaratnam.sutharsun.mobilefridge.DBAdapter.getAllCars(DBAdapter.java:101)
04-09 18:14:49.123:E / AndroidRuntime(23297):在wijayaratnam.sutharsun.mobilefridge.MyFridge.fillData(MyFridge.java:146)
04-09 18:14:49.123:E / AndroidRuntime(23297):在wijayaratnam.sutharsun.mobilefridge.MyFridge.onCreate(MyFridge.java:29)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.app.Activity.performCreate(Activity.java:4465)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
04-09 18:14:49.123:E / AndroidRuntime(23297):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)
04-09 18:14:49.123:E / AndroidRuntime(23297):... 11个
如果你的错误是一个SQL未找到列,然后重新写你的创建表
语句这样:
私有静态最后弦乐DATABASE_CREATE =
CREATE TABLE+ DATABASE_TABLE +(
+ KEY_ROWID +整数主键自动增量
+为key_type +文本不为空,
+ KEY_WEIGHT +整数NOT NULL,
+ KEY_EXP +整数空);;
您会注意到你定义 KEY_EXP =到期日
但在你创建你手动调用列 EXP $ C声明$ C>;即列未找到。尽量使用那些你创建变量尽可能限制这些类型的错别字。祝你好运!
This question is famous but everyone always says go to see this Notepad Tutorial.
Which helps, but it doesn't help that much when you are stuck.
So I have this database that I've created on Android and I'd like to display it in a listview, I did the tutorial but I still don't understand why I cant make it work on my project, so if there is someone who can help, please show yourself!
here is my code
public class MyFridge extends ListActivity {
private DBAdapter db;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.notepad_list);
db = new DBAdapter(this);
db.open();
fillData();
}@Override
public boolean onCreateOptionsMenu (Menu menu)
{
super.onCreateOptionsMenu(menu);
CreateMenu(menu);
return true;
}
@Override
public boolean onOptionsItemSelected (MenuItem item)
{
switch(item.getItemId())
{
case 0:
Intent f = new Intent(MyFridge.this, Addform.class);
startActivity(f);
return true;
case 1:
Intent r = new Intent(MyFridge.this, MyRecipes.class);
startActivity(r);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void CreateMenu(Menu menu)
{
MenuItem mnu1 = menu.add(0, 0, 0, "Add ingredient");
{
mnu1.setAlphabeticShortcut('a');//Change the alphabetic shortcut associated with this item.
mnu1.setIcon(R.drawable.ic_launcher);
}
MenuItem mnu2 = menu.add(0, 1, 1, "Delete ingredient");
{
mnu2.setAlphabeticShortcut('b');//Change the alphabetic shortcut associated with this item.
mnu2.setIcon(R.drawable.ic_launcher);
}
}
private void fillData() {
// Get all of the notes from the database and create the item list
Cursor c = db.getAllCars();
startManagingCursor(c);
String[] from = new String[] { DBAdapter.KEY_TYPE };
int[] to = new int[] { R.id.text1 };
// Now create an array adapter and set it to display using our row
SimpleCursorAdapter notes =
new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);
setListAdapter(notes);
}
And here is my database:
public class DBAdapter {
public static final String KEY_ROWID = "_id";
public static final String KEY_TYPE = "type";
public static final String KEY_WEIGHT = "weight";
public static final String KEY_EXP = "expiration day";
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "MyDB";
private static final String DATABASE_TABLE = "Fridge";
private static final int DATABASE_VERSION = 2;
private static final String DATABASE_CREATE =
"create table Fridge (_id integer primary key autoincrement, "
+ "type text not null, weight integer not null, exp integer not null);";
//CHECK (P_Id>0)
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public DBAdapter(Context ctx)
{
this.context = ctx;
//It lets newly created objects understand what has been going on.
//Typically you call it to get information regarding another part of your program
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);//calls the context in the parent class
}
@Override
public void onCreate(SQLiteDatabase db)
{
try {
db.execSQL(DATABASE_CREATE);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) // this method is used if the OS or the version App is changed
{
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS cars");
onCreate(db);
}
}
//---opens the database---
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
//---closes the database---
public void close()
{
DBHelper.close();
}
//---insert a contact into the database---
public long insertCar(String type, int weight, int exp)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_TYPE, type);
initialValues.put(KEY_WEIGHT, weight);
initialValues.put(KEY_EXP, exp);
return db.insert(DATABASE_TABLE, null, initialValues);
}
//---deletes a particular contact---
public boolean deleteCar(long rowId)
{
return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}
//---retrieves all the contacts---
public Cursor getAllCars()
{
return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TYPE,
KEY_WEIGHT, KEY_EXP}, null, null, null, null, null);
}
/*
* retrieves a particular car
*
*/
public Cursor getCar(String searchString) //throws SQLException
{
Cursor mCursor =
db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
KEY_TYPE, KEY_WEIGHT,KEY_EXP},KEY_TYPE +"="+"'"+searchString+"'" +" OR "+ KEY_ROWID + "=" + "'"+searchString +"'"+" OR "+ KEY_EXP + "=" + "'"+searchString +"'"+" OR " + KEY_WEIGHT + "=" + "'" + searchString +"'", null,
null, null, null, null);
return mCursor;
}
//---updates a contact---
public boolean updateCar(long rowId, String type, int weight, int exp)
{
ContentValues args = new ContentValues();
args.put(KEY_TYPE, type);
args.put(KEY_WEIGHT, weight);
args.put(KEY_EXP, exp);
return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
}
}
Logcat information.
04-09 18:14:47.128: D/TextLayoutCache(23297): Using debug level: 0 - Debug Enabled: 0
04-09 18:14:47.173: D/CLIPBOARD(23297): Hide Clipboard dialog at Starting input: finished by someone else... !
04-09 18:14:49.113: I/SqliteDatabaseCpp(23297): sqlite returned: error code = 1, msg = no such table: Fridge, db=xxx
04-09 18:14:49.113: D/AndroidRuntime(23297): Shutting down VM
04-09 18:14:49.118: W/dalvikvm(23297): threadid=1: thread exiting with uncaught exception (group=0x40c281f8)
04-09 18:14:49.123: E/AndroidRuntime(23297): FATAL EXCEPTION: main
04-09 18:14:49.123: E/AndroidRuntime(23297): java.lang.RuntimeException: Unable to start activity ComponentInfo{wijayaratnam.sutharsun.mobilefridge/wijayaratnam.sutharsun.mobilefridge.MyFridge}: android.database.sqlite.SQLiteException: no such table: Fridge: , while compiling: SELECT _id, type, weight, expiration day FROM Fridge
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.app.ActivityThread.access$600(ActivityThread.java:127)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.os.Handler.dispatchMessage(Handler.java:99)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.os.Looper.loop(Looper.java:137)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.app.ActivityThread.main(ActivityThread.java:4507)
04-09 18:14:49.123: E/AndroidRuntime(23297): at java.lang.reflect.Method.invokeNative(Native Method)
04-09 18:14:49.123: E/AndroidRuntime(23297): at java.lang.reflect.Method.invoke(Method.java:511)
04-09 18:14:49.123: E/AndroidRuntime(23297): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
04-09 18:14:49.123: E/AndroidRuntime(23297): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
04-09 18:14:49.123: E/AndroidRuntime(23297): at dalvik.system.NativeStart.main(Native Method)
04-09 18:14:49.123: E/AndroidRuntime(23297): Caused by: android.database.sqlite.SQLiteException: no such table: Fridge: , while compiling: SELECT _id, type, weight, expiration day FROM Fridge
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:127)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:94)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:53)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1690)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1575)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1531)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1611)
04-09 18:14:49.123: E/AndroidRuntime(23297): at wijayaratnam.sutharsun.mobilefridge.DBAdapter.getAllCars(DBAdapter.java:101)
04-09 18:14:49.123: E/AndroidRuntime(23297): at wijayaratnam.sutharsun.mobilefridge.MyFridge.fillData(MyFridge.java:146)
04-09 18:14:49.123: E/AndroidRuntime(23297): at wijayaratnam.sutharsun.mobilefridge.MyFridge.onCreate(MyFridge.java:29)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.app.Activity.performCreate(Activity.java:4465)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
04-09 18:14:49.123: E/AndroidRuntime(23297): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)
04-09 18:14:49.123: E/AndroidRuntime(23297): ... 11 more
If your error is a sql "column not found", then re-write your create table
statement to this:
private static final String DATABASE_CREATE =
"create table " + DATABASE_TABLE + " ("
+ KEY_ROWID + " integer primary key autoincrement, "
+ KEY_TYPE + " text not null, "
+ KEY_WEIGHT + " integer not null, "
+ KEY_EXP + " integer not null);";
You'll notice that you define KEY_EXP = "expiration day"
but in your create statement you manually call the column exp
; ie column not found. Try to use those variables you create as much as possible to limit these kinds of typos. Good luck!
这篇关于如何显示在ListView android的数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!