SQLite 无法与 Tabhost 一起使用 - Android
我一直在玩 SQLite 一点,我正在研究如何创建选项卡。我正在使用 http://developer.android.com/resources 中的记事本示例/tutorials/notepad/index.html 并制作了 3 个选项卡。问题是当我保存值时,sqlite 无法获取编辑文本中的内容。当我尝试在历史选项卡中查看它们时,它只显示我在创建选项卡之前保存的旧值。当我单击在创建选项卡之前保存的选项时,它会将我带到该活动,而无需顶部的选项卡,然后我实际上可以更新它。因此,当选项卡位于顶部时,它似乎无法获取编辑文本中的内容,但当它是自己的布局时却能够获取。
创建选项卡时是否缺少任何内容?
这是我迄今为止在第一个选项卡中所拥有的内容:
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;
}
I have been playing around with SQLite a little bit and I was looking at how to create tabs. I'm using the notepad example from http://developer.android.com/resources/tutorials/notepad/index.html and made 3 tabs working with it. The problem is that sqlite isn't able to pick up what is in the edittexts when I save the values. When I try to view them in my history tab, it only displays my old values which I had saved before I made the tabs. When I click on the ones which I had saved before I made the tabs, it takes me to the activity, WITHOUT the tabs at the top and then I'm actually able to update it. So, it seems like it's not able to get what is in the edittexts when the tabs are at the top, but is able to when it's a layout on it's own.
Is there anything that I'm missing when creating the tabs?
This what I have so far in first tab:
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("");
}
History tab that displays entries:
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 Class:
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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我想出了如何解决这个问题。我在 Tab1 类中添加了以下代码:
private DbAdapter mDbHelper;
然后在 onCreate 方法中添加了此代码
最后删除了 onClick 方法中的所有内容并放入:
还要关闭我创建的数据库 onDestroy方法并调用
I figured out how to fix this problem. I added the following code in the Tab1 class:
private DbAdapter mDbHelper;
and then added this in the onCreate method
And finally ereased everything out of the onClick method and put in:
Also to close the database I created onDestroy method and called