【问题标题】:SQLite database in android and javaandroid和java中的SQLite数据库
【发布时间】:2010-12-09 13:12:23
【问题描述】:

我在理解 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 控制台进行了检查。

我的问题是如何在应用程序中从不同的活动中查询这个数据库,例如我想在我的应用程序中查询数据库:SELECT title FROM books;它将返回 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 语句之后使用变量 cont_array 来填充 ListView。任何人都知道我哪里出错了,LogCat 中没有任何内容可以告诉我哪里出错了?

【问题讨论】:

    标签: java sql android sqlite


    【解决方案1】:

    在您的活动中执行以下操作:

    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();
        }
    }
    

    【讨论】:

    • 在使用您的代码后编辑了我的问题,但仍然有错误。
    • 没有具体的错误信息,很难说。但是您的代码中有一个常见的陷阱。尝试使用cont_array = (String[]) list.toArray(new String[list.size()])
    • 我认为 kI 已经对这个问题进行了排序,但是数据的获取似乎没有带回任何东西,所以 list.add(cursor.getString(0));似乎什么也没做。我使用 TextView 对此进行了测试,并将结果放入该文本视图中,但它返回 false。
    【解决方案2】:

    为了读取和写入数据库,您需要首先在您的Activitys 中获取一个 SQLiteDatabase 对象的实例。使用 DatabaseHelper 类,您可以通过调用 databaseHelper.getReadableDatabase() 或 databaseHelper.getWritableDatabase() 来执行此操作,具体取决于您需要采取的操作(读/写)。

    拥有SQLiteDatabase 的实例后,您可以使用它的各种辅助方法来执行CRUD 操作。例如,为了运行查询SELECT title FROM books,您可以使用各种query() 方法之一。还有insert()、update() 和delete() 方法可用。这些方法有时会返回一个Cursor,然后可以在ListView 等对象中使用它来遍历数据库中的结果集。如果可能的话,我建议您使用Cursor 而不是将结果填充到数组中,这仅仅是因为有相当数量的方法和对象可以很好地与游标配合使用。

    注意:确保在完成读/写操作后关闭 SQLiteDatabase 的所有实例,以避免任何资源泄漏问题。

    如果您需要更多信息,我建议您阅读API Documentation 中每个课程的详细信息。

    【讨论】:

      【解决方案3】:

      请查看我在 SQLite 上的帖子 http://android-pro.blogspot.com/2010/10/using-sqlite-database-with-android.html

      有一个示例应用程序,你可以下载它并检查你想要的东西

      【讨论】:

      • 请不要发布链接而不是答案。而是发布答案,如果需要更多解释,请发布链接。这样,如果链接失效,答案仍然可用。
      • 我发布了链接以避免写大量文字
      • 对不起,我不同意你的瓦伦丁。在我看来,该链接似乎非常有用,而且在这里发布格式良好的文本也有点困难。
      • @Valen @mina @saxos 每周至少有几次问题因为引用的链接已失效而变得无用。至少,那些是我们得到标志的。
      猜你喜欢
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      相关资源
      最近更新 更多