Получение данных из существующей базы данных sqlite

У меня есть существующая база данных sqlite. Я разрабатываю приложение для Android и хочу связать его с существующей базой данных sqlite.

Проблема 1: Я уже включил базу данных sqlite в свой проект с помощью функции «DDMS push database function» в соответствии с советом моего инструктора. Теперь я хочу получить данные из базы данных, нужно ли мне использовать SQLiteOpenHelper. Если да, то как его использовать и что будет закодировано в функциях onCreate (SQLiteDatabase db) и onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion), поскольку у нас уже есть База данных, нам действительно не нужно ее создавать .

Проблема 2: Что нужно сделать, чтобы просто получить необходимые данные из существующей базы данных.

Поскольку я новичок, я очень запутался, может ли кто-нибудь объяснить эти концепции и помочь мне решить эту проблему. Любая помощь будет оценена.

Я видел учебник для этой цели, предложенный @TronicZomB, но согласно этому руководству (http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/), у меня должно быть все таблицы с полем первичного ключа как _id.

У меня есть 7 таблиц, а именно направления, события, тур, tour_cat, tour_dest, android_metadata и sqlite_sequence. В общем, только tour_dest не удовлетворяет условиям наличия первичного ключа с именем _id. Как разобраться в этом?

Ниже приведен снимок экрана с таблицей, в которой отсутствует поле первичного ключа, необходимое для привязки полей идентификаторов таблиц базы данных. Снимок экрана таблицы, в которой отсутствует поле первичного ключа, необходимое для привязки полей идентификаторов таблиц базы данных.


person divyang7    schedule 22.07.2013    source источник


Ответы (3)


Методы onCreate и onUpgrade будут пустыми, поскольку у вас уже есть база данных. Есть отличное руководство о том, как добиться этого здесь.

Затем вы можете получить доступ к базе данных следующим образом (пример):

public ArrayList<String> getValues(String table) {
    ArrayList<String> values = new ArrayList<String>();

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT value FROM " + table, null);

    if(cursor.moveToFirst()) {
        do {
            values.add(cursor.getString(cursor.getColumnIndex("value")));
        }while(cursor.moveToNext());
    }

    cursor.close();
    db.close();
    return values;
}
person TronicZomB    schedule 22.07.2013
comment
Я видел этот урок, но у меня есть небольшая проблема по этому поводу. Он говорит, что все ваши таблицы должны иметь поле _id. Но у меня есть таблица, в которой нет поля первичного ключа. И согласно руководству мне нужно иметь поле первичного ключа с именем _id. Теперь для этого мне нужно воссоздать таблицу, в которой будет потеря данных. что делать.. - person divyang7; 22.07.2013
comment
хм ... Я использовал этот учебник, и мой столбец идентификатора в одной таблице указан как идентификатор, и ни одна из моих других таблиц не имеет целого числа первичного ключа, и он отлично работает для меня ... - person TronicZomB; 22.07.2013
comment
Я отредактировал свой вопрос и добавил изображение, также описывающее текущую структуру таблицы, в которой отсутствует первичный ключ _id. Остальные все таблицы имеют первичный ключ _id и, таким образом, соответствуют условиям предоставленного вами руководства. - person divyang7; 22.07.2013

Если вы не очень хорошо знакомы с запросами, базами данных и т. Д., Я настоятельно рекомендую вам использовать http://satyan.github.io/sugar/, он также удалит большую часть кода шаблона, необходимого для создания sqlite в Android.

person Ryan S    schedule 22.07.2013

1. Если БД уже существует, onCreate не будет вызываться. onUpgrade будет вызываться только в том случае, если вы измените версию БД. onUpgrade вам следует использовать, если в базе данных вашего приложения произошли некоторые изменения, и вам необходимо плавно выполнить миграцию на новую структуру данных.

public class DbInit extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "name";
    private static final int DATABASE_VERSION = 3;
    private static final String DATABASE_CREATE = "create table  connections  . .. . ...

    public DbInit(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(DATABASE_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         if (isChangeFromToVersion(1, 2, oldVersion, newVersion)) {
             //Execute UPDATE here
         }
    }

    private boolean isChangeFromToVersion(int from, int to, int oldVersion, int newVersion ) {
        return (from == oldVersion && to == newVersion);
  }
....

2. Простой пример, как открыть соединение с БД и получить объект курсора.

public class DAO {

private SQLiteDatabase database;
private DbInit dbHelper;

public ConnectionDAO(Context context) {
    dbHelper = new DbInit(context);
}

public void open() throws SQLException {
    database = dbHelper.getWritableDatabase();
}

public Connection getConnectionById(long id) {
    Cursor cursor = null;
    try {
        open();
        cursor = database.query(DbInit.TABLE_CONNECTIONS, allColumns, DbInit.COLUMN_ID + " = '" + id + "'", null, null, null, null);
        if (!cursor.moveToFirst())
            return null;
        return cursorToConnection(cursor);
    } finally {
        if (cursor != null)
            cursor.close();
        close();
    }
}

private Connection cursorToConnection(Cursor cursor) {
    Connection connection = new Connection();
    connection.setId(cursor.isNull(0) ? null : cursor.getInt(0));
    connection.setName(cursor.isNull(1) ? null : cursor.getString(1));
    .....
    .....
    return connection;
}
person Divers    schedule 22.07.2013