Создать синтаксис таблицы в Android SQLite исправлениях - PullRequest
1 голос
/ 22 февраля 2012

Извините, мне пришлось удалить свой предыдущий пост из-за работы.,вот более общее решение проблемы, с которой я столкнулся, которая не ссылается ни на что конкретно, а работает скорее как скелет того, как это должно быть сделано с использованием решения, которое мне было дано.

/// -------------------- Самые последние правки в этом сообщении ----------------------------------

Хорошо, ребята и девчонки, оказывается, здесь нет ошибки в моем синтаксисе, однако моя методология была не самой умной.Я был осведомлен о том, как сделать это правильно для тех из вас, кому здесь нужно решение, оно заключается в создании нескольких таблиц в одной базе данных с android (по крайней мере, так, как я это сделал.) .......

Хорошо, очистите все классы dbHelper, встроенные в ваши dbAdapters, и создайте отдельный класс dbhelper, который расширяет SQLiteOpenHelper.Делая это, вы можете использовать свои классы для доступа к информации, ссылаясь на отдельный dbAdapter SliteOpenHelper.Вот пример автономного вспомогательного класса и одного из моих адаптеров, которые я использовал для доступа к нему.

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class DatabaseHelper extends SQLiteOpenHelper
{
//-----------------------------------Member Variables---------------------------
    private static final String DATABASE_NAME = "databaseName";
    private static final int DATABASE_VERSION = 1;
//----------------------------------------------------------------------

    DatabaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        // nothing here cause not upgrading version right now
        Log.w(DatabaseHelper.class.getName(),
            "Upgrading database from version " + oldVersion + " to "
            + newVersion + ", which will destroy all old data");

    db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME  + Table1DbAdapter.DATABASE_TABLE);
    db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME  + Table2DbAdapter.DATABASE_TABLE);

        onCreate(db);
    }
    @Override
    public void onCreate(SQLiteDatabase db)
    {

        db.execSQL(Table1DbAdapter.CREATE_TABLE_ONE);
        db.execSQL(Table2DbAdapter.CREATE_TABLE_TWO);

    }

}

// и один пример того, как использовать этот помощник из класса, который обращается к table1 (сделалто же самое для всех других таблиц)

public class Table1DbAdapter {


static final String DATABASE_TABLE = "table1";


public static final String KEY_TITLE = "title";
public static final String KEY_BODY = "body";
public static final String KEY_ROWID = "_id";

private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;


 static final String CREATE_TABLE_ONE =
            "create table " + DATABASE_TABLE + "("
            + KEY_ROWID + " integer primary key autoincrement, "
            + KEY_TITLE + " text not null, "
            + KEY_BODY + " text not null )";


private final Context mCtx;

public Table1DbAdapter(Context ctx) {
    this.mCtx = ctx;
}

// create the database
public Table1DbAdapter open() throws android.database.SQLException{
    this.mDbHelper = new DatabaseHelper(mCtx);
    this.mDb = mDbHelper.getWritableDatabase();
    return this;
}

// create an entry
public long createEntry(String title, String body){
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_TITLE, title);
    initialValues.put(KEY_BODY, body);

    return 
        this.mDb.insert(DATABASE_TABLE, null, initialValues);
}
// delete an Entry
public boolean deleteEntry(long rowId){
    return 
        this.mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" +rowId, null) > 0;
}
// fetch all Entries
public Cursor fetchAllEntries(){
    return this.mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE, 
                    KEY_BODY}, null, null, null, null, null);
    }
// fetch an Entry
public Cursor fetchEntry(long rowId) throws SQLException{
    Cursor mCursor = 
    mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE, 
                    KEY_BODY}, KEY_ROWID +"="+ 
                        rowId, null, null, null, null, null);
    if (mCursor != null){
        mCursor.moveToFirst();
    }
    return mCursor;
}
// update an Entry
public boolean updateEntry(long rowId, String title, String body){
    ContentValues args = new ContentValues();
    args.put(KEY_TITLE, title);
    args.put(KEY_BODY, body);

    return
    this.mDb.update(DATABASE_TABLE, args, KEY_ROWID + "="+ rowId, null)> 0;

}
// close the database
public void close(){
    mDbHelper.close();
}

}

// Я надеюсь, что это помогает .... еще раз извините за удаление ранее, но это то, как это должно быть сделано.,,по крайней мере, пока я не найду что-нибудь более эффективное

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

Похоже, ваша база данных существует , а ваша таблица (удобства) - нет.

Поэтому onCreate () никогда не вызывается, потому что БД уже существует.

При последующем выполнении запроса SELECT выдается исключение.

Я почти уверен, что если вы используете отладчик и перебираете свой код, вы увидите, что это происходит.

Решение :

  • Удалить БД с вашего устройства ИЛИ
  • Выполните оператор CREATE TABLE непосредственно из sqlite3
1 голос
/ 22 февраля 2012

ОК, без обид, но ваша методология действительно нуждается в доработке. Этот код - полная путаница.

Что касается объяснения причины исключения ...

Ни в одной точке этого кода не создается экземпляр MainDbAdapter. В результате его onCreate(...) метод никогда не вызывается, поэтому в основном у вас нет таблиц (все они, я имею в виду, не только таблица удобств будут отсутствовать).

Если честно, я бы не вкладывал производное SQLiteOpenHelper в "адаптер" любого рода.

Создайте автономный класс, который расширяет SQLiteOpenHelper, и просто создайте его экземпляр всякий раз, когда вам это нужно.

Избавьтесь от вложенных DatabaseHelper классов в ваших классах «адаптера», пересоберите, посмотрите, на что жалуется Eclipse (если вы используете Eclipse), а затем исправьте его, направив все на ваш автономный SQLiteOpenHelper.

1 голос
/ 22 февраля 2012

Лучший источник для изучения синтаксиса SQLite - Домашняя страница SQLite

И ваш синтаксис выглядит правильно.

РЕДАКТИРОВАТЬ : Да, вам нужно удалить базу данных из папки приложения и позволить приложению создать новую базу данных для вас, как кто-то в комментарии предложил вам сделать. Потому что метод onCreate() проверяет, существует ли база данных, а если нет, то создает новую.

Вы можете удалить базу данных, перейдя в DDMS в Eclipse. Базы данных обычно хранятся в

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