Создание базы данных SQL при первом запуске и получение данных базы данных при следующих запусках - PullRequest
2 голосов
/ 13 ноября 2011

касательно разработки под Android, я просто пытаюсь создать базу данных SQL при первом запуске активности (используя настройки).Во второй раз, когда действие запускается, он должен извлечь данные из базы данных и вывести сообщение журнала.

Мне удалось запустить операцию в первый раз (я предполагаю, что база данных была создана здесь), но во второй раз я получаю ошибку IllegalStateException: получить слот поля из строки 0 в столбец -1 не удалось.Не совсем уверен, где я ошибся здесь.может кто-нибудь проверить?Спасибо

Основной класс

public class MainMenu extends Activity implements OnClickListener{
private ModulesDbAdapter mpDbHelper;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //create database here
    SharedPreferences initialPref = getSharedPreferences("INITIAL", 0);
    boolean firsttimer = initialPref.getBoolean("INITIAL", false);

    if (!firsttimer){
        //create database here
        mpDbHelper = new ModulesDbAdapter(this);
        mpDbHelper.open();

        long id1 = mpDbHelper.createReminder("Hello1", "Test 1", "Date1");
        long id2 = mpDbHelper.createReminder("Hello2", "Test 2", "Date2");
        long id3 = mpDbHelper.createReminder("Hello3", "Test 3", "Date3");

        /*Cursor c = mpDbHelper.fetchModules((String)"CS118");
        Log.d("TESTING",c.getString(c.getColumnIndex("KEY_MOD_NAME")));*/

        //get boolean preference to true
        SharedPreferences.Editor editorPref = initialPref.edit();
        editorPref.putBoolean("INITIAL", true);
        editorPref.commit();
    }else {
        fetchData();
    }
}

private void fetchData(){
    mpDbHelper = new ModulesDbAdapter(this);
    mpDbHelper.open();
    long input = 2;

    Cursor c = mpDbHelper.fetchReminder(input);
    startManagingCursor(c);
    Log.d("TESTING",c.getString(c.getColumnIndex("KEY_BODY")));
}

/*@Override
protected void onPause() {
    super.onPause();
    mpDbHelper.close();
}

@Override
protected void onStop() {
    super.onPause();
    mpDbHelper.close();
}*/

}
}

Класс адаптера

public class ModulesDbAdapter {
private static final String DATABASE_NAME = "data";
private static final String DATABASE_TABLE = "reminders";
private static final int DATABASE_VERSION = 1;

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

private DatabaseHelper mDbHelper; 
private SQLiteDatabase mDb;

//defines the create script for the database
private static final String DATABASE_CREATE =
        "create table " + DATABASE_TABLE + " ("
        + KEY_ROWID + " integer primary key autoincrement, "
        + KEY_TITLE + " text not null, "
        + KEY_BODY + " text not null, "
        + KEY_DATE_TIME + " text not null);";

//Context object that will be associated with the SQLite database object
private final Context mCtx;

//The Context object is set via the constructor of the class
public ModulesDbAdapter(Context ctx) {
    this.mCtx = ctx;
}

//helps with the creation and version management of the SQLite database.
private static class DatabaseHelper extends SQLiteOpenHelper {

    //call made to the base SQLiteOpenHelper constructor. This call creates, opens, and/or manages a database
    DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DATABASE_CREATE); 
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion,int newVersion) {
        // Not used, but you could upgrade the database with ALTER
        // Scripts
    }
}

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

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

public long createReminder(String title, String body, String
    reminderDateTime) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_TITLE, title);
    initialValues.put(KEY_BODY, body);
    initialValues.put(KEY_DATE_TIME, reminderDateTime);

    //insert row into database
    return mDb.insert(DATABASE_TABLE, null, initialValues);
}



public boolean deleteReminder(long rowId) {
    return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}

//utilizes the query() method on the SQLite database to find all the reminders in the system
public Cursor fetchAllReminders() {
    return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE,
    KEY_BODY, KEY_DATE_TIME}, null, null, null, null, null);
}

public Cursor fetchReminder(long rowId) throws SQLException { 
    Cursor mCursor =
    mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
    KEY_TITLE, KEY_BODY, KEY_DATE_TIME}, KEY_ROWID + "=" +
    rowId, null, null, null, null, null);



    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

public boolean updateReminder(long rowId, String title, String body, String reminderDateTime) {
    ContentValues args = new ContentValues();
    args.put(KEY_TITLE, title);
    args.put(KEY_BODY, body);
    args.put(KEY_DATE_TIME, reminderDateTime);
    return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
}
        // The SQLiteOpenHelper class was omitted for brevity
        // That code goes here.

}

Ответы [ 3 ]

1 голос
/ 13 ноября 2011

Ошибка проста. Вы определили KEY_BODY как значение статической строковой константы в классе DbAdapter, но вы использовали строковый литерал "KEY_BODY" в своем коде доступа.

Log.d("TESTING",c.getString(c.getColumnIndex("KEY_BODY")));

должно быть

Log.d("TESTING",c.getString(c.getColumnIndex(ModulesDbAdapter.KEY_BODY)));
1 голос
/ 13 ноября 2011

Вам не нужно явно проверять, была ли создана ваша база данных.Если вы создаете подкласс SQLiteOpenHelper, реализующий onCreate (SQLiteDatabase), onUpgrade (SQLiteDatabase, int, int) будет «знать», не создана ли база данных, если она уже существует.

В противном случае ваша ошибка вызванастрока:

Log.d("TESTING",c.getString(c.getColumnIndex("KEY_BODY")));

, поскольку в качестве индекса столбца используется строка «KEY_BODY», а не значение статической строковой переменной KEY_BODY.

0 голосов
/ 13 ноября 2011

Я считаю, что ваша проблема в вашей строке журнала. Измените строку на литерал:

Log.d("TESTING",c.getString(c.getColumnIndex(KEY_BODY)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...