【问题标题】:SQLite not working with Tabhost - AndroidSQLite 不适用于 Tabhost - Android
【发布时间】:2011-11-22 14:49:46
【问题描述】:

我一直在玩 SQLite,我正在研究如何创建选项卡。我正在使用来自http://developer.android.com/resources/tutorials/notepad/index.html 的记事本示例,并使用它制作了 3 个选项卡。问题是当我保存值时,sqlite 无法获取编辑文本中的内容。当我尝试在我的历史选项卡中查看它们时,它只显示我在创建选项卡之前保存的旧值。当我单击在创建标签之前保存的那些时,它会将我带到活动,顶部没有标签,然后我实际上可以更新它。所以,当标签位于顶部时,它似乎无法获取EditText中的内容,但能够在它是一个完整的布局时。

在创建标签时我有什么遗漏吗?

这是我目前在第一个标签中的内容:

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

【问题讨论】:

  • When the tabs are at the top with the activity below, it's not able to save the values that are in the edittext fields and then display them in the history tab.
  • 代码也太多了!尝试缩小范围!
  • 同时发布您的 DBHelper 课程。我看到的第一件事是你从来没有调用过 db.close(),这些值是否真的插入到了数据库中?您可以使用 sqlite3 cmd 行验证它们是否在数据库中?
  • 发布你的日志。那里应该有一些错误。你调试过你的代码吗?是否调用了更新方法?
  • 这是独立的。当我删除选项卡并点击保存时,值将存储在数据库中并显示在 ListView 中。 @OvidiuLatcu 在 logcat 中没有给我任何错误。

标签: android sqlite layout view android-tabhost


【解决方案1】:

我想出了如何解决这个问题。我在 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2019-10-14
    • 1970-01-01
    • 2012-04-12
    • 2014-04-09
    相关资源
    最近更新 更多