2016-05-06 4 views
1

初めてここに投稿すると、長い時間lurker。私はSQLiteデータベースを使ってデータを保持するAndroidアプリを開発しています。最初のビューは、ユーザーがAnimalの名前を追加、変更、または削除できるListViewです。編集ボタンを押すと、2番目のビューに移動します。このビューには、最初のビューから転送された名前とIDを持つ、DOBやコメントなどの同じ動物の詳細が表示されます。EditTextでSQLiteデータベースから1つのフィールドを表示

私が遭遇している問題は、現在の動物のDOBとコメントをデータベースからそれぞれのEditTextに表示する方法を理解できないことです。私はこのビューの一番下にある保存ボタンを持っています。これらのフィールドにはすでに情報を保存しておく必要がありますが、このビューに戻ると、入力した内容を表示する必要があります。私の2つのビューと私のDBHelperクラスのコードは以下の通りです。ありがとう!

ここに2つのビューの外観を示します。私は問題を抱えています

public class MainActivity extends AppCompatActivity 
{ 
public final static String ID_EXTRA = "com.example.josh.boergoats._ID"; 
public final static String NAME_EXTRA = "com.example.josh.boergoats.name"; 

private DBHelper dbHelper = null; 
private Cursor cursor = null; 
private DBAdapter adapter = null; 
EditText editAnimal = null; 
String animalId = null; 
long idAnimal = 0; 

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

     ListView listView = (ListView) findViewById(R.id.listView); 
     editAnimal = (EditText) findViewById(R.id.animalEditText); 

     dbHelper = new DBHelper(this); 

     cursor = dbHelper.getAll(); 
     startManagingCursor(cursor); 

     adapter = new DBAdapter(cursor); 
     listView.setAdapter(adapter); 

     Button addButton = (Button) findViewById(R.id.addButton); 
     addButton.setOnClickListener(onSave); 

     Button deleteButton = (Button) findViewById(R.id.deleteButton); 
     deleteButton.setOnClickListener(onDelete); 

     Button editButton = (Button) findViewById(R.id.editButton); 
     editButton.setOnClickListener(onEdit); 

     listView.setOnItemClickListener(onListClick); 
    } 
    catch (Exception e) 
    { 
     Log.e("ERROR", "ERROR IN CODE: " + e.toString()); 
     e.printStackTrace(); 
    } 
} 

@Override 
protected void onDestroy() 
{ 
    super.onDestroy(); 
    dbHelper.close(); 
} 

private View.OnClickListener onSave = new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     Button addButton = (Button) findViewById(R.id.addButton); 
     if (animalId == null) 
     { 
      dbHelper.insert(editAnimal.getText().toString()); 
     } 
     else 
     { 
      dbHelper.update(animalId, editAnimal.getText().toString()); 
      animalId = null; 
     } 
     cursor.requery(); 
     editAnimal.setText(""); 
     addButton.setText("Add Animal"); 
    } 
}; 

private View.OnClickListener onDelete = new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     if (animalId == null) 
     { 
      return; 
     } 
     else 
     { 
      dbHelper.delete(animalId); 
      animalId = null; 
     } 
     cursor.requery(); 
     editAnimal.setText(""); 

     Button addButton = (Button) findViewById(R.id.addButton); 
     addButton.setText("Add Animal"); 
    } 
}; 

private View.OnClickListener onEdit = new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     Button editButton = (Button) findViewById(R.id.editButton); 
     editButton.setVisibility(View.INVISIBLE); 

     Button addButton = (Button) findViewById(R.id.addButton); 
     addButton.setText("Add Animal"); 

     Intent i = new Intent(MainActivity.this, DetailActivity.class); 
     //i.putExtra(ID_EXTRA, String.valueOf(id)); 
     i.putExtra(NAME_EXTRA, String.valueOf(editAnimal.getText().toString())); 
     i.putExtra(ID_EXTRA, String.valueOf(idAnimal)); 
     editAnimal.setText(""); 
     startActivity(i); 
    } 
}; 

private AdapterView.OnItemClickListener onListClick = new AdapterView.OnItemClickListener() 
{ 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    { 
     animalId = String.valueOf(id); 
     Cursor c = dbHelper.getById(animalId); 
     c.moveToFirst(); 
     editAnimal.setText(dbHelper.getAnimal(c)); 

     Button addButton = (Button) findViewById(R.id.addButton); 
     addButton.setText("Update"); 

     Button editButton = (Button) findViewById(R.id.editButton); 
     editButton.setVisibility(View.VISIBLE); 

     idAnimal = id; 
    } 
}; 


public class DBAdapter extends CursorAdapter 
{ 
    DBAdapter(Cursor c) 
    { 
     super(MainActivity.this, c); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor c) 
    { 
     DBHolder holder = (DBHolder) view.getTag(); 
     holder.populateFrom(c, dbHelper); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) 
    { 
     LayoutInflater inflater = getLayoutInflater(); 
     View row = inflater.inflate(R.layout.row, parent, false); 
     DBHolder holder = new DBHolder(row); 
     row.setTag(holder); 
     return(row); 
    } 

} 

static class DBHolder 
{ 
    private TextView name = null; 

    DBHolder(View row) 
    { 
     name = (TextView) row.findViewById(R.id.nameTextView); 
    } 

    void populateFrom(Cursor c, DBHelper helper) 
    { 
     //name.setText(r.getName(c)); 
     name.setText(helper.getAnimal(c)); 
    } 
} 
} 

二アクティビティ、DetailActivity、:

Detail View

ListView Primary View

最初のビューとリストビューが含まれていMainActivity

public class DetailActivity extends AppCompatActivity 
{ 

private DBHelper dbHelper = null; 
//private Cursor cursor = null; 
String passedName = null; 
String passedID = null; 
private EditText passedIdView = null; 
private EditText passedNameView = null; 
private EditText dobView = null; 
private EditText commentsView = null; 


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

    //dbHelper = new DBHelper(this); 
    //cursor = dbHelper.getAllInfo(); 


    passedName = getIntent().getStringExtra(MainActivity.NAME_EXTRA); 
    passedNameView = (EditText) findViewById(R.id.nameDetailEditText); 
    passedNameView.setText(passedName); 

    passedID = getIntent().getStringExtra(MainActivity.ID_EXTRA); 
    passedIdView = (EditText) findViewById(R.id.idDetailEditText); 
    passedIdView.setText(passedID); 

    dobView = (EditText) findViewById(R.id.dobDetailEditText); 
    commentsView = (EditText) findViewById(R.id.commentsDetailEditText); 

    Button saveButton = (Button) findViewById(R.id.saveButton); 
    saveButton.setOnClickListener(onSave); 

} 

private View.OnClickListener onSave = new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     String id = passedID; 


     passedID = getIntent().getStringExtra(MainActivity.ID_EXTRA); 

     if (passedNameView.getText().toString() != null) 
     { 
      if (passedID != null) 
      { 
       dbHelper.update(id, passedNameView.getText().toString()); 
      } 

     } 
     if (dobView.getText().toString() != null) 
     { 
      dbHelper.updateDob(id, dobView.getText().toString()); 
     } 
     if (commentsView.getText().toString() != null) 
     { 
      dbHelper.updateComments(id, commentsView.getText().toString()); 
     } 


     //reset all edittext fields to blank before leaving 
     passedIdView.setText(""); 
     passedNameView.setText(""); 
     dobView.setText(""); 
     commentsView.setText(""); 


     Intent i = new Intent(DetailActivity.this, MainActivity.class); 
     startActivity(i); 
    } 
}; 

} 

データベースが作成され、操作されるデータベースヘルパークラス。すべてのメソッドが使用されているわけではないことに注意してください。そのうちのいくつかは私の実験のものです。

public class DBHelper extends SQLiteOpenHelper 

{ 

private static final String dbPath = "/data/data/com.example.josh.boergoats/"; 
private static final String dbName = "animals.db"; 
private static final int schemaVersion = 1; 

public DBHelper(Context context) 
{ 
    super(context, dbName, null, schemaVersion); 
    //this.myContext = context; 
} 

@Override 
public void onCreate(SQLiteDatabase db) 
{ 
    db.execSQL("CREATE TABLE Animals (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, dob TEXT, comments TEXT);"); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
{ 
} 

public void insert(String animal) 
{ 
    ContentValues cv = new ContentValues(); 
    cv.put("name", animal); 
    getWritableDatabase().insert("Animals", "name", cv); 
} 

public void update(String id, String animal) 
{ 
    ContentValues cv = new ContentValues(); 
    String[] args = {id}; 
    cv.put("name", animal); 
    getWritableDatabase().update("Animals", cv, "_id=?", args); 
} 

public void updateDob(String id, String dob) 
{ 
    ContentValues cv = new ContentValues(); 
    String[] args = {id}; 
    cv.put("dob", dob); 
    getWritableDatabase().update("Animals", cv, "_id=?", args); 
} 

public void updateComments(String id, String comment) 
{ 
    ContentValues cv = new ContentValues(); 
    String[] args = {id}; 
    cv.put("comments", comment); 
    getWritableDatabase().update("Animals", cv, "_id=?", args); 
} 

public void delete(String id) 
{ 
    getWritableDatabase().delete("Animals", "_id=?", new String[] {id}); 
} 
public Cursor getAll() 
{ 
    return(getReadableDatabase().rawQuery("SELECT _id, name FROM Animals", null)); 
} 

public Cursor getAllInfo() 
{ 
    return(getReadableDatabase().rawQuery("SELECT _id, name, dob, comments FROM Animals", null)); 
} 

public String getAnimal(Cursor c) 
{ 
    return(c.getString(1)); 
} 

public String getDob(Cursor c) 
{ 
    return(c.getString(2)); 
} 

public String getComments(Cursor c) 
{ 
    return(c.getString(3)); 
} 

public Cursor getById(String id) 
{ 
    String[] args = {id}; 
    return(getReadableDatabase().rawQuery("SELECT _id, name FROM Animals WHERE _id=?", args)); 
} 

} 

ありがとうございます。

答えて

0

私がしているのは、同じアクティビティを使用して追加または編集することです(これはあなたがしようとしていると思います)。インテントエクストラを介してそれぞれのオプションを渡し、コードを設定しますそれぞれの値。ここでの例です: - 更新モードの

 String caller = getIntent().getStringExtra("Caller"); 

     if(getIntent().getStringExtra("Caller").equals("ShopListByCursorActivityUpdate")) { 
      ((EditText) findViewById(R.id.ase_storename_input)).setText(getIntent().getStringExtra("ShopName")); 
      ((EditText) findViewById(R.id.ase_storeorder_input)).setText(getIntent().getStringExtra("ShopOrder")); 
      ((EditText) findViewById(R.id.ase_storestreet_input)).setText(getIntent().getStringExtra("ShopStreet")); 
      ((EditText) findViewById(R.id.ase_storecity_input)).setText(getIntent().getStringExtra("ShopCity")); 
      ((EditText) findViewById(R.id.ase_storestate_input)).setText(getIntent().getStringExtra("ShopState")); 
      ((EditText) findViewById(R.id.ase_storephone_input)).setText(getIntent().getStringExtra("ShopPhone")); 
      ((EditText) findViewById(R.id.ase_storenotes_input)).setText(getIntent().getStringExtra("ShopNotes")); 
      setTitle(getResources().getString(R.string.title_activity_shop_edit)); 
     } 

2行目のチェックが(すなわちテントエクストラ命名発信者にあるもの(呼び出し側)に抽出)は、その後、それぞれの値を設定する自分自身をインテントエクストラにあります。 1行目は必要ありません私はちょうどそこにデバッグ目的のためにそれを持っていました。

ノートとは対照的にされて追加することがShopListByCursorActivityに設定されているときにテントエクストラCallerShopListByCursorActivityUpdateに設定されている[追加するには、[編集]によって呼び出されます。

PS変更された/保存されたデータが表示されない場合は、最初のアクティビティで問題が発生している可能性があります。要するに、これが問題であれば。カーソルを再構築する(つまり、クエリをやり直す)必要があります。changeCursorSwapCursorまたはnotifyDataSetChangedで新しい/修正されたカーソルを使用するようにアダプタを取得する必要があります。例えば: -

Cursor csr = shopperdb.getShopsAsCursor(); 
currentsca.swapCursor(csr); 

に関してでは

あなたは正しい軌道に乗っているコメントに、私は実際に私がテントエキストラに必要な情報を入れてトラブルを抱えていました。私は最初のアクティビティでDOBやコメントフィールドを持っていないので、私はその情報を自分のデータベースから取り出し、インテントExtraに何とか入れておく必要があります。これらの2つのフィールドは私のDBHelperクラスで作成されます。また、データベースからどのように引き出すことができるかによっては、私の編集テキストに直接入れることができれば、インテント・エクストラに入れる必要さえないかもしれません。

そして、その後、すべての列が返されたカーソルで利用できるようになりますのgetAllのすべての列を取得するにはSELECT * FROM Animalsを使用してください。

+0

ご迷惑をおかけします。私はちょうど私がEditTextsの設定を複製したことに気づいた。 – MikeT

+0

私は自分の問題を指定したときにもっと明確にすべきでした。あなたは正しい軌道に乗っていますが、実際には必要な情報をインテント・エクストラに入れることができませんでした。私は最初のアクティビティでDOBやコメントフィールドを持っていないので、私はその情報を自分のデータベースから取り出し、インテントExtraに何とか入れておく必要があります。これらの2つのフィールドは私のDBHelperクラスで作成されます。また、データベースからどのように引き出すことができるかによっては、私の編集テキストに直接入れることができれば、インテント・エクストラに入れる必要さえないかもしれません。元の返信をありがとう! – Ganon

+0

'SELECT * FROM Animals'を使用して' getAll'のすべての列を取得すると、すべての列が返されたCursorで使用可能になります。 – MikeT

関連する問題