SQLite не работает с Tabhost - Android - PullRequest
0 голосов
/ 22 ноября 2011

Я немного поигрался с SQLite и смотрел, как создавать вкладки.Я использую пример блокнота из http://developer.android.com/resources/tutorials/notepad/index.html и сделал с ним 3 вкладки.Проблема в том, что sqlite не может выбрать то, что находится в текстовом редакторе, когда я сохраняю значения.Когда я пытаюсь просмотреть их на своей вкладке истории, отображаются только мои старые значения, которые я сохранил до создания вкладок.Когда я нажимаю на те, которые я сохранил до создания вкладок, я перехожу к действию, БЕЗ вкладок вверху, и затем я на самом деле могу его обновить.Таким образом, кажется, что он не может получить то, что находится в edittexts, когда вкладки находятся наверху, но может, когда это отдельный макет.

Есть ли что-то, что я пропускаю, когдасоздание вкладок?

Это то, что у меня есть на первой вкладке:

private EditText etVelocity;
private EditText etType;
private Long mRowId;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.new_entry);

    etVelocity = (EditText) findViewById(R.id.etVelocity);
    etType = (EditText) findViewById(R.id.etType);

    Button bSave = (Button) findViewById(R.id.btnSave);
    Button bReset = (Button) findViewById(R.id.btnReset);

    mRowId = null;
    Bundle extras = getIntent().getExtras();

    if (extras != null)
    {
        String title = extras.getString(DbAdapter.KEY_TITLE);
        String body = extras.getString(DbAdapter.KEY_BODY);
        mRowId = extras.getLong(DbAdapter.KEY_ROWID);

        if (title != null)
        {
            etVelocity.setText(title);
        }

        if (body != null)
        {
            etType.setText(body);
        }
    }

    bSave.setOnClickListener(new View.OnClickListener()
    {

        public void onClick(View view)
        {
            Bundle bundle = new Bundle();

            bundle.putString(DbAdapter.KEY_TITLE, etVelocity.getText().toString());
            bundle.putString(DbAdapter.KEY_BODY, etType.getText().toString());

            if (mRowId != null)
            {
                bundle.putLong(DbAdapter.KEY_ROWID, mRowId);
            }

            Intent mIntent = new Intent();
            mIntent.putExtras(bundle);
            setResult(RESULT_OK, mIntent);
            finish();
        }

    });

    bReset.setOnClickListener(new View.OnClickListener()
    {

        @Override
        public void onClick(View v)
        {
            // TODO Auto-generated method stub
            resetDisplay();
        }
    });
}

public void resetDisplay()
{
    etVelocity.setText("");
    etType.setText("");
}

Вкладка истории, в которой отображаются записи:

private static final int ACTIVITY_CREATE=0;
private static final int ACTIVITY_EDIT=1;

private static final int INSERT_ID = Menu.FIRST;
private static final int DELETE_ID = Menu.FIRST + 1;

private DbAdapter mDbHelper;
private Cursor mNotesCursor;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.notes_list);
    mDbHelper = new DbAdapter(this);
    mDbHelper.open();
    fillData();
    registerForContextMenu(getListView());
}

private void fillData() {
    // Get all of the rows from the database and create the item list
    mNotesCursor = mDbHelper.fetchAllNotes();
    startManagingCursor(mNotesCursor);

    // Create an array to specify the fields we want to display in the list (only TITLE)
    String[] from = new String[]{DbAdapter.KEY_TITLE};

    // and an array of the fields we want to bind those fields to (in this case just text1)
    int[] to = new int[]{R.id.text1};

    // Now create a simple cursor adapter and set it to display
    SimpleCursorAdapter notes = 
        new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor, from, to);
    setListAdapter(notes);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    menu.add(0, INSERT_ID, 0, R.string.menu_insert);
    return true;
}

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    switch(item.getItemId()) {
        case INSERT_ID:
            createNote();
            return true;
    }

    return super.onMenuItemSelected(featureId, item);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(0, DELETE_ID, 0, R.string.menu_delete);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case DELETE_ID:
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
            mDbHelper.deleteNote(info.id);
            fillData();
            return true;
    }
    return super.onContextItemSelected(item);
}

private void createNote() {
    Intent i = new Intent(this, Tab1.class);
    startActivityForResult(i, ACTIVITY_CREATE);
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Cursor c = mNotesCursor;
    c.moveToPosition(position);
    Intent i = new Intent(this, Tab1.class);
    i.putExtra(DbAdapter.KEY_ROWID, id);
    i.putExtra(DbAdapter.KEY_TITLE, c.getString(
            c.getColumnIndexOrThrow(DbAdapter.KEY_TITLE)));
    i.putExtra(DbAdapter.KEY_BODY, c.getString(
            c.getColumnIndexOrThrow(DbAdapter.KEY_BODY)));
    startActivityForResult(i, ACTIVITY_EDIT);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    Bundle extras = intent.getExtras();
    switch(requestCode) {
        case ACTIVITY_CREATE:
            String title = extras.getString(DbAdapter.KEY_TITLE);
            String body = extras.getString(DbAdapter.KEY_BODY);
            mDbHelper.createNote(title, body);
            fillData();
            break;
        case ACTIVITY_EDIT:
            Long rowId = extras.getLong(DbAdapter.KEY_ROWID);
            if (rowId != null) {
                String editTitle = extras.getString(DbAdapter.KEY_TITLE);
                String editBody = extras.getString(DbAdapter.KEY_BODY);
                mDbHelper.updateNote(rowId, editTitle, editBody);
            }
            fillData();
            break;
    }
}

Класс DbAdapter:

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

private static final String TAG = "NotesDbAdapter";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;

private static final String DATABASE_CREATE =
    "create table notes (_id integer primary key autoincrement, "
    + "title text not null, body text not null);";

private static final String DATABASE_NAME = "data";
private static final String DATABASE_TABLE = "notes";
private static final int DATABASE_VERSION = 2;

private final Context mCtx;

private static class DatabaseHelper extends SQLiteOpenHelper {

    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) {
        Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS notes");
        onCreate(db);
    }
}

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

public DbAdapter open() throws SQLException {
    mDbHelper = new DatabaseHelper(mCtx);
    mDb = mDbHelper.getWritableDatabase();
    return this;
}

public void close() {
    mDbHelper.close();
}

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

    return mDb.insert(DATABASE_TABLE, null, initialValues);
}

public boolean deleteNote(long rowId) {

    return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}

public Cursor fetchAllNotes() {

    return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE,
            KEY_BODY}, null, null, null, null, null);
}

public Cursor fetchNote(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;

}

public boolean updateNote(long rowId, String title, String body) {
    ContentValues args = new ContentValues();
    args.put(KEY_TITLE, title);
    args.put(KEY_BODY, body);

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

1 Ответ

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

Я разобрался, как решить эту проблему. Я добавил следующий код в класс Tab1:

private DbAdapter mDbHelper;

, а затем добавил это в методе onCreate

mDbHelper = new DbAdapter(this);
mDbHelper.open();

И, наконец, избавился от всего метода onClick и вставил:

String velocity = etVelocity.getText().toString();
String type = etType.getText().toString();
mDbHelper.createNote(velocity, type);

Также для закрытия базы данных я создал метод onDestroy и вызвал

mDbHelper.close();
...