2011-11-22 70 views
0

我一直在玩SQLite一點點,我正在研究如何創建選項卡。我使用http://developer.android.com/resources/tutorials/notepad/index.html中的記事本示例,並使用3個選項卡處理它。問題是,當我保存值時,sqlite無法獲取edittext中的內容。當我嘗試在我的歷史記錄選項卡中查看它們時,它只顯示我在製作選項卡之前保存的舊值。當我點擊我在製作標籤之前保存的內容時,它會將我帶到活動中,而沒有頂部的標籤,然後我實際上可以更新它。所以,當選項卡位於頂部時,它似乎無法獲取edittext中的內容,但是可以在它自己的佈局上得到它。SQLite不與Tabhost一起工作 - Android

創建選項卡時是否有任何缺少的東西?

這是我在第一個選項卡至今:

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

定義「無法正常工作」 – Selvin

+0

當選項卡位於頂部且下方有活動時,它無法保存edittext字段中的值,然後將其顯示在歷史記錄選項卡中。 – user990230

+0

那也是太多的代碼!嘗試縮小它! – gideon

回答

1

我想通了,如何解決這個問題。我加在TAB1類下面的代碼:

private DbAdapter mDbHelper;

,然後在onCreate方法

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

最後ereased一切出的onClick方法,並把在添加此:

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

同樣關閉數據庫我創建了onDestroy方法,並調用

mDbHelper.close();