代替回答
以下は、かなり基本的な、しかし実用的な例のコードです。ただし、 ListView を組み込むことで、さらに進んでいます。 ListViewのアイテムをロングクリックして削除を許可する 。
ただし、これはフラグメントを使用しません。
MainActivityの3つのコードがあります (MainActivity.java
)、SQLiteOpenHelperサブクラス CrimeDBHelper (CrimeDBHelper.java
)およびMainActivityのレイアウトactivity_main.xml
:-
activity_main.xml
これは非常に簡単です。 ListViewが含まれていることに注意してください 最後に。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="The Crime Thing"
android:layout_gravity="center"
android:textStyle="bold"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Crime Title"
/>
<EditText
android:id="@+id/crimetitle"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Crime Date"
/>
<EditText
android:id="@+id/crimedate"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Suspect"
/>
<EditText
android:id="@+id/crimesuspect"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Crime Solved?"
/>
<CheckBox
android:id="@+id/crimesolved"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content" />
</LinearLayout>
<Button
android:id="@+id/addcrime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ADD CRIME"/>
<Button
android:id="@+id/dltcrime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DLT CRIME (ID=?)"/>
<ListView
android:id="@+id/crimelist"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
CrimeDBHelper.java
追加のメソッドgetCrimeList()
を除いて、ほとんどが似ています。 、これは、犯罪テーブルからのすべてのデータを含むカーソルを返します(ListViewへの入力に使用されます)。
public class CrimeDBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "crimesdb";
public static final int DBVERSION = 1;
public static final String CRIMESTABLE = "crimes";
public static final String CRIMEID_COL = "_id";
public static final String CRIMETITLE_COL = "crimetitle";
public static final String CRIMEDATE_COL = "crimedate";
public static final String CRIMESUSPECT_COL = "crimesuspect";
public static final String CRIMESOLVED_COL = "crimesolved";
public static final String TABLECRTSQL =
"CREATE TABLE " + CRIMESTABLE + "(" +
CRIMEID_COL + " INTEGER PRIMARY KEY," +
CRIMETITLE_COL + " TEXT," +
CRIMEDATE_COL + " TEXT, " +
CRIMESUSPECT_COL + " TEXT, " +
CRIMESOLVED_COL + " INTEGER" +
");";
public CrimeDBHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(TABLECRTSQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
}
public long addCrime(String crimetitle, String crimedate, String crimesuspect, int crimesolved) {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(CRIMETITLE_COL,crimetitle);
cv.put(CRIMEDATE_COL,crimedate);
cv.put(CRIMESUSPECT_COL,crimesuspect);
cv.put(CRIMESOLVED_COL,crimesolved);
return db.insert(CRIMESTABLE,null,cv);
}
public int deleteCrime(long crimeid) {
SQLiteDatabase db = getWritableDatabase();
String whereclause = CRIMEID_COL + "=?";
String[] whereargs = {Long.toString(crimeid)};
return db.delete(CRIMESTABLE,whereclause,whereargs);
}
public Cursor getCrimeList() {
SQLiteDatabase db = getWritableDatabase();
return db.query(CRIMESTABLE,null,null,null,null,null,null,null);
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
EditText mCrimeTitle;
EditText mCrimeDate;
EditText mCrimeSuspect;
CheckBox mCrimeSolved;
Button mAddCrime;
Button mDltCrime;
ListView mCrimeList;
CrimeDBHelper dbhlpr = new CrimeDBHelper(this);
Cursor crimelist;
SimpleCursorAdapter sca;
long lastcrimeid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCrimeTitle = (EditText) findViewById(R.id.crimetitle);
mCrimeDate = (EditText) findViewById(R.id.crimedate);
mCrimeSuspect = (EditText) findViewById(R.id.crimesuspect);
mCrimeSolved = (CheckBox) findViewById(R.id.crimesolved);
mCrimeList = (ListView) findViewById(R.id.crimelist);
mAddCrime = (Button) findViewById(R.id.addcrime);
mDltCrime = (Button) findViewById(R.id.dltcrime);
crimelist = dbhlpr.getCrimeList();
// Setup Button to Add a crime
mAddCrime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int solved = 0;
if (mCrimeSolved.isChecked()) {
solved = 1;
}
lastcrimeid = dbhlpr.addCrime(
mCrimeTitle.getText().toString(),
mCrimeDate.getText().toString(),
mCrimeSuspect.getText().toString(),
solved
);
mDltCrime.setText("DLT CRIME (ID=" + Long.toString(lastcrimeid) + ")");
mDltCrime.setTag(lastcrimeid);
crimelist = dbhlpr.getCrimeList();
sca.swapCursor(crimelist);
}
});
// Setup button to delete the latest Crime added
mDltCrime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//dbhlpr.deleteCrime(lastcrimeid); can do it this way
if (view.getTag() != null) {
dbhlpr.deleteCrime((long)view.getTag());
crimelist = dbhlpr.getCrimeList();
sca.swapCursor(crimelist);
}
}
});
sca = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1,
crimelist,
new String[]{CrimeDBHelper.CRIMETITLE_COL},
new int[]{android.R.id.text1},
0
);
mCrimeList.setAdapter(sca);
mCrimeList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
dbhlpr.deleteCrime(l);
crimelist = dbhlpr.getCrimeList();
sca.swapCursor(crimelist);
return true;
}
});
}
protected void onDestroy() {
super.onDestroy();
if (crimelist != null) {
crimelist.close();
}
}
}
最初に注意するのは、long lastcrimeid;
という行です。 、これはクラスレベルで宣言されているため、全体で非常に利用可能です( long databaseID
で発生していた問題 )。
SimpleCursorAdapter sca;
にも気付くかもしれません。 これはListView
に使用されます (基本的には、カーソルからのデータをListViewに配置します 。
次のコードの多くに精通している必要があります。要約すると:-
- super.onCreateが呼び出されます。
- アクティビティは、activity_main.xmlレイアウトを使用するように設定されています。
- レイアウトが読み込まれると、ビューに関連付けられたIDが取得されます。
-
データベースから現在の犯罪を取得するカーソルが取得されます(ない場合もありますが、これは問題ではありません)。
-
犯罪を追加するためのボタンリスナーが追加されました。これは返された_idを使用することに注意してください 追加された行の2回(削除ボタンのテキストがそれに応じて変更されるため、実際には3回 )。
-
lastcrimeid
addCrime()
の戻り値によって設定されます メソッド。 -
mDltCrime.setTag(lastcrimeid);
削除ボタンのタグを_id
に設定します 追加された行の。 -
また、
crimelist = dbhlpr.getCrimeList();
という2つの追加行が存在することにも注意してください。 およびsca.swapCursor(crimelist);
。- 1つ目はカーソルを現在データベースにあるもの(つまり、追加された行を含む)に置き換え、2つ目はListViewに新しいカーソルを使用するように指示するため、ListViewはデータベースに現在あるものを表示します(これは、行を削除するときに再び使用されます。
-
次に、削除ボタンのボタンリスナーが追加されます。これは2つの方法で機能します。
lastcrimeid
両方を_idに保持するために使用することも、ボタンのタグを使用することもできます。 削除する行の。コードには前者がコメントアウトされているため、後者の方法が使用されます(つまり、ボタンのタグの値が取得されます)。- この後者の方法には、値がnullになる可能性があるという欠点があることに注意してください。これにより、nullポインター例外が発生するため、
if (view.getTag != null)
。
- この後者の方法には、値がnullになる可能性があるという欠点があることに注意してください。これにより、nullポインター例外が発生するため、
-
上記のようにListViewを更新します 。
-
次に、SimpleCursorAdapterがセットアップされ、5つのパラメーターが必要です。-
- 使用するレイアウト(android.R.layout.simple_list_item_1)はストックレイアウトです。
- カーソルの形式で使用されるデータ。ノート! _idという名前の列 存在する必要があります(通常、常に
_id INTEGER PRIMARY KEY
を使用することをお勧めします このため。 )カーソルcrimelist
を取得することに注意してくださいgetCrimeList
経由 メソッド。 - データの取得元となるカーソル内の列。
- 取得したデータが配置されるレイアウトのビュー。
- 目的を思い出せない値。ただし、0を使用しても問題ありません。この5番目のパラメーターをコーディングしないと、非推奨のメッセージが表示される可能性があります。
- (私は通常、カスタムCursorAdaptersを使用します。これは、はるかに柔軟性があり、Simplesを使用することはめったにないためです)。
-
-
次に、ListViewは、
mCrimeList.setAdapter(sca);
に従ってアダプタを使用するように指示されます。 。 -
次に、
onItemLongClickListener
ListViewに追加され、ロングクリックされた犯罪が削除されます(longlは_id です) 値、したがってCursorAdapterが _idを必要とする理由 したがって、なぜdbhlpr.deleteCrime(l);
。- もう一度ListView 更新されます。
-
最後に、アクティビティが使用されている間にカーソルが使用されるため、
onDestory
メソッドはカーソルを閉じるために使用されます(カーソルは終了時に常に閉じる必要があります)。
これは、3つの犯罪が追加された(きれいではありませんが機能的な)外観です(削除ボタンは世紀の犯罪を削除します) 犯罪)。リストされている犯罪を長押しすると、その犯罪は削除されます。 [追加]をクリックすると、データが変更されない限り、Crime oftheCenturyの別のエントリが追加されます。