Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android和java中的SQLite数据库_Java_Sql_Android_Sqlite - Fatal编程技术网

android和java中的SQLite数据库

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

我在理解SQLite数据库在android中如何工作的概念上有点困难。我创建了一个DatabaseHelper.java类,如下所示:

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。