База данных SQLite в Android и Java - PullRequest
3 голосов
/ 09 декабря 2010

У меня возникли трудности с пониманием концепции работы баз данных 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.

Мой вопрос заключается в том, как запросить эту базу данных в приложении из другого действия, например, я хочу, чтобы в моем приложении запрашивалась база данных: ВЫБРАТЬ заголовок ИЗ книг; который вернет мне названия из таблицы книг, как мне подключиться к базе данных, выполнить этот запрос и сохранить все результаты в массиве?

---------------------------------- Редактировать ------------ ----------------------------

Прямо в той части, где я хочу сделать запрос, я поместил этот код:

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

Который передает категорию вниз по сравнению с предыдущим действием. Из ответа Оливье. Этот код вызывает сбой приложения, и я понятия не имею, почему. переменная cont_array используется после этого оператора if для заполнения ListView. У кого-нибудь есть идеи, где я ошибаюсь, в LogCat нет ничего, что могло бы сказать мне, где это происходит?

Ответы [ 3 ]

3 голосов
/ 09 декабря 2010

В вашей деятельности выполните следующие действия:

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();
    }
}
3 голосов
/ 09 декабря 2010

Для чтения и записи в базу данных вам необходимо сначала получить экземпляр объекта SQLiteDatabase в одном из ваших Activity s.Используя свой класс DatabaseHelper, вы можете сделать это, позвонив по номеру databaseHelper.getReadableDatabase() или databaseHelper.getWritableDatabase() в зависимости от того, какое действие вам нужно предпринять (чтение / запись).

После того, как у вас есть экземпляр SQLiteDatabase, выможет использовать различные вспомогательные методы для выполнения операций CRUD.Например, чтобы выполнить запрос SELECT title FROM books, вы можете использовать один из различных методов query().Также доступны методы insert(), update() и delete().Эти методы иногда возвращают Cursor, который затем можно использовать в таких объектах, как ListView, для прохождения набора результатов из базы данных.Я бы порекомендовал вам использовать Cursor против результатов вставки в массив, если это возможно, просто потому, что есть приличное количество методов и объектов, которые хорошо работают с курсорами.

Примечание: Обязательно закройте любой экземпляр SQLiteDatabase после завершения чтения / записи, чтобы избежать проблем с утечкой ресурсов.

Если вам нужна дополнительная информация, я рекомендую ознакомиться со спецификой каждого класса в документации API .

1 голос
/ 09 декабря 2010

, пожалуйста, проверьте мой пост на SQLite http://android -pro.blogspot.com / 2010/10 / using-sqlite-database-with-android.html

есть примерприложение, вы можете скачать его и проверить, что вы хотите

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...