android和java中的SQLite数据库
我在理解SQLite数据库在android中如何工作的概念上有点困难。我创建了一个DatabaseHelper.java类,如下所示:android和java中的SQLite数据库,java,sql,android,sqlite,Java,Sql,Android,Sqlite,我在理解SQLite数据库在android中如何工作的概念上有点困难。我创建了一个DatabaseHelper.java类,如下所示: import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHelper extends SQLiteOpenHelper
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "library.db";
public static final String TITLE = "title";
public static final String MUSICTITLE = "musictitle";
public static final String AUTHOR = "author";
public static final String ARTIST = "artist";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL( "CREATE TABLE music (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, artist TEXT);");
db.execSQL( "CREATE TABLE books (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT);");
db.execSQL( "CREATE TABLE movies (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
android.util.Log.v("Constants",
"Upgrading database which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS books");
db.execSQL("DROP TABLE IF EXISTS music");
db.execSQL("DROP TABLE IF EXISTS movies");
onCreate(db);
}
}
据我所知,这确实有效,并且已经使用adb控制台进行了检查
我的问题是如何从不同的活动中在应用程序中查询此数据库,例如,我希望在我的应用程序中查询数据库:从书籍中选择标题;这将返回book表中的标题,如何连接到数据库,运行此查询,然后将所有结果存储到数组中
----------------------------------编辑----------------------------------------
在我要查询的部分,我放置了以下代码:
if (category.equals("Books")){
img.setImageResource(R.drawable.book);
ArrayList<String> list = new ArrayList<String>();
dh = new DatabaseHelper(this);
SQLiteDatabase db = dh.getReadableDatabase();
Cursor cursor = db.query("books", new String[] { "title" }, null, null, null, null, "title desc");
if (cursor.moveToFirst()) {
do {
list.add(cursor.getString(1));
} while (cursor.moveToNext());
}
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
list.add("Test");
cont_array = (String[]) list.toArray();
db.close();
}
if(category.equals(“Books”)){
img.setImageResource(R.drawable.book);
ArrayList=新建ArrayList();
dh=新数据库助手(此);
SQLiteDatabase db=dh.getReadableDatabase();
Cursor Cursor=db.query(“books”,新字符串[]{“title”},null,null,null,“title desc”);
if(cursor.moveToFirst()){
做{
list.add(cursor.getString(1));
}while(cursor.moveToNext());
}
if(cursor!=null&!cursor.isClosed()){
cursor.close();
}
列表。添加(“测试”);
cont_数组=(字符串[])list.toArray();
db.close();
}
将类别向下传递到上一个活动。根据奥利弗的回答。这段代码使应用程序崩溃,我不知道为什么。变量cont_数组在该if语句之后用于填充ListView。任何人都知道我哪里出了问题,LogCat中没有任何东西可以告诉我哪里出了问题?为了读取和写入数据库,您需要首先在一个
活动中获取SQLiteDatabase对象的实例。使用DatabaseHelper
类,您可以通过调用DatabaseHelper.getReadableDatabase()
或DatabaseHelper.getwriteabledatabase()
来实现这一点,具体取决于您需要执行的操作(读/写)
拥有SQLiteDatabase
的实例后,可以使用其各种辅助方法执行CRUD操作。例如,要运行查询selecttitlefromsbooks
,可以使用多种query()
方法之一。还有可用的insert()
、update()
和delete()
方法。这些方法有时会返回一个光标
,然后可以在列表视图
等对象中使用该光标来遍历数据库中的结果集。如果可能的话,我建议您使用游标
而不是将结果填充到数组中,因为有相当数量的方法和对象可以很好地使用游标
注意:确保在完成读/写操作后关闭SQLiteDatabase
的任何实例,以避免任何资源泄漏问题
如果您需要更多信息,我建议您阅读中每个类的详细信息。请查看我在SQLite上的帖子
这里有一个示例应用程序,您可以将其下载并检查活动中需要的内容。请执行以下操作:
public class DBAct extends Activity {
private DataHelper dh;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//init your activity here
//e.g. setContentView(R.layout.main);
dh = new DataHelper(this);
SQLiteDatabase db = dh.getReadableDatabase();
Cursor cursor = db.query("books", new String[] { "title" }, null, null, null, null, "title desc");
if (cursor.moveToFirst()) {
do {
list.add(cursor.getString(0));
} while (cursor.moveToNext());
}
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
db.close();
}
}
请不要发布链接而不是答案。把答案贴出来,如果需要更多的解释,就贴上链接。这样,如果链接失效,答案仍然可用。我发布链接是为了避免写大量的文字对不起,我不同意你的观点。在我看来,这个链接似乎非常有用,而且在这里发布格式良好的文本也有点困难。@Valen@mina@saxos一周至少发布几次。一个问题变得毫无用处,因为引用的链接已失效。至少,这些是我们得到的标志。使用代码后编辑了我的问题,但仍然有错误。如果没有具体的错误消息,很难说。但代码中有一个常见的陷阱。尝试使用cont_array=(String[])list.toArray(新字符串[list.size()])
I已经解决了这个问题,但是数据的获取似乎没有带来任何结果,所以list.add(cursor.getString(0));似乎什么都没做。我使用TextView测试了这个,并将结果放入该文本视图中,但返回false。