はい、これは行うことができます。単純な方法で上記を模倣するには、データベースに2つのテーブルのチャットとメッセージがあると仮定します。彼らは両方とも、2つの列に一意の識別子とテキストの列を持っています。 SQLiteOpenHelperのサブクラスを使用して
我々としてDBHlpr.javaという名前のファイルを持つことができます: - onCreate
方法がCHATTABLEあたりとして(2つのテーブルすなわちチャットとメッセージを作成します
public class DBHlpr extends SQLiteOpenHelper {
static final String DBNAME = "mydb";
static final String CHATTABLE = "chats";
static final String MSGTABLE = "messages";
static final String TEXTCOL = "textdata";
static final String IDCOL = "_id";
DBHlpr(Context context) {
super(context,DBNAME,null,1);
}
public void onCreate(SQLiteDatabase db){
db.execSQL("CREATE TABLE " + CHATTABLE + " (" + IDCOL + " INTEGER PRIMARY KEY, " + TEXTCOL + " TEXT)");
db.execSQL("CREATE TABLE " + MSGTABLE + " (" + IDCOL + " INTEGER PRIMARY KEY, " + TEXTCOL + " TEXT)");
}
public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
}
public void insertRow(String table, String text) {
ContentValues cv = new ContentValues();
cv.put(TEXTCOL,text);
long id = this.getWritableDatabase().insert(table,null,cv);
Log.d("DBHLP-INSRT","Added row with ID=" + Long.toString(id));
}
public Cursor getRows(String table, String srchstr) {
SQLiteDatabase db = getWritableDatabase();
String whereclause = null;
if (srchstr.length() > 0) {
whereclause = TEXTCOL + " LIKE '%" + srchstr + "%' ";
}
return db.query(
table,
null,whereclause,null,null,null,null);
}
}
およびMSGTABLE)。
onUpgrade is required but does nothing as yet.
insertRow
は(どちらも同じ構造を有しているように)のいずれかのテーブルに行を追加するために使用することができます。挿入が簡単に確認できるようにログに書き込むことに注意してください。
getRows
は、データを含むカーソル(データベースからのデータ)を取得するために使用されます。ここでも、この1つの方法を両方のテーブルに使用できます。これは、(検索フィールドに入力されたデータごとに)テーブルをフィルタリングするために使用される文字列(長さが0より大きい場合)に渡されます。
活動が、この場合には、それは特別なものは何もありませんactivity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="mjt.so45787986.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Search" />
<EditText
android:id="@+id/search"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Chats" />
<ListView
android:id="@+id/chats"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Messages" />
<ListView
android:id="@+id/messages"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
</LinearLayout>
なり、2つのリストビューを指定したレイアウトが必要になります、それは検索のためのEditTextで、非常にシンプルなレイアウトですテキスト・ビューをチャット・リスト(次のListView)の見出しとして、次にメッセージ用の別のTextViewおよびListViewとして評価します。
MainActivity.javaは次のようになります -
public class MainActivity extends AppCompatActivity {
DBHlpr dbhlpr = new DBHlpr(this);
Cursor chatcursor;
Cursor msgcursor;
TextWatcher tx;
EditText search;
ListView chatlist;
ListView msglist;
SimpleCursorAdapter chat_sca;
SimpleCursorAdapter msg_sca;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
search = (EditText) findViewById(R.id.search);
chatlist = (ListView) findViewById(R.id.chats);
msglist = (ListView) findViewById(R.id.messages);
// Add some data for testing
dbhlpr.insertRow(DBHlpr.CHATTABLE, "This is my first chat");
dbhlpr.insertRow(DBHlpr.CHATTABLE, "This is my second chat");
dbhlpr.insertRow(DBHlpr.CHATTABLE, "This is my third chat");
dbhlpr.insertRow(DBHlpr.MSGTABLE, "First Message");
dbhlpr.insertRow(DBHlpr.MSGTABLE, "Second Message");
dbhlpr.insertRow(DBHlpr.MSGTABLE, "Third Message");
chatcursor = dbhlpr.getRows(DBHlpr.CHATTABLE,"");
chat_sca = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_1,
chatcursor,
new String[]{DBHlpr.TEXTCOL},
new int[]{android.R.id.text1},
0
);
chatlist.setAdapter(chat_sca);
msgcursor = dbhlpr.getRows(DBHlpr.MSGTABLE,"");
msg_sca = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_1,
msgcursor,
new String[]{DBHlpr.TEXTCOL},
new int[]{android.R.id.text1},
0
);
msglist.setAdapter(msg_sca);
search.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
refreshCursors();
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
private void refreshCursors() {
chatcursor = dbhlpr.getRows(DBHlpr.CHATTABLE,search.getText().toString());
chat_sca.swapCursor(chatcursor);
msgcursor = dbhlpr.getRows(DBHlpr.MSGTABLE,search.getText().toString());
msg_sca.swapCursor(msgcursor);
}
@Override
public void onDestroy() {
super.onDestroy();
chatcursor.close();
msgcursor.close();
}
}
まず、いくつかのクラス変数が定義されています -
DBHlpr dbhlpr = new DBHlpr(this);
Cursor chatcursor;
Cursor msgcursor;
は、データベースに関連しています。最初はDBHlprのインスタンスを作成し、残りの2つは2つのカーソル(チャットとメッセージ)用です。
TextWatcher tx;
EditText search;
ListView chatlist;
ListView msglist;
ビューを処理するためのものです。 TextWatcherは、検索の変更を検出するために使用されます。
SimpleCursorAdapter chat_sca;
SimpleCursorAdapter msg_sca;
ListViewsにデータベースデータを適合させるためのものです。名前が示すように、これらはかなり基本的ですが、デモンストレーションのために行います。
onCreate
の最初の5行はかなり標準的です。
次の6行はすべて基本的に同じdbhlpr.insertRow(DBHlpr.CHATTABLE, "This is my first chat");
と同じであり、それぞれのテーブルと格納されるデータを渡すinsertRowメソッドを呼び出します。最初に実行されるのは、データベースが作成されるときです。これらの行は、いくつかのテストデータを提供するためだけに存在します。
その後、我々は(これは基本的に繰り返され、次が、メッセージテーブルのコードを注意してください)に来て: -
chatcursor = dbhlpr.getRows(DBHlpr.CHATTABLE,"");
chat_sca = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_1,
chatcursor,
new String[]{DBHlpr.TEXTCOL},
new int[]{android.R.id.text1},
0
);
chatlist.setAdapter(chat_sca);
最初の行は、あたりとして、それぞれのデータ(すべてのチャット行でカーソルを取得します第2パラメータ)。 2番目〜9番目の行は、単純カーソルAdapaterを設定する単一のコマンドです(1番目のパラメータはコンテキスト、2番目は使用するレイアウト(簡単なものを使用します)、3番目はデータを保持するCursor、4番目はカーソル内のデータを取得する列、5番目はデータが配置されるビューID、6番目は0でなければなりません)。 最後の行は、アダプタを使用するようにListViewに指示します。
これに続いて、TextWatcherが検索に追加されます。ここでは、refreshCursors
メソッドを呼び出すonTextChangedメソッドが使用されています。
refreshCursors
メソッドは、変更された検索データを使用して、データベースから既存のカーソルにデータを取得し、データが変更されたことをswapCursor
によってadpaterに通知します。
最後に、onDestroy
メソッドは、アクティビティが終了しようとしているときにカーソルを閉じるために使用されます。
最初に実行します - 検索フィールドにFを入力した後
を: -
ありがとうございました。 @MikeT。 –