私のアプリは着信と発信を記録し、アプリケーションのホームディレクトリとファイルパス、ファイル名、期間、コールタイプをSqliteに記録するサービスを持っています。私のMainActivityでは、SimpleCursorAdapterを使ってSqliteから読み込まれたリストビューを持っています。データが格納され、リストビューに正しく表示されています。 問題 ユーザーがリストアイテムをクリックし、このアイテムに関連するオーディオを別のプレイヤーアクティビティで再生する必要があります。どのように私はこれを達成することができますか? ファイルパスはSqliteの各エントリに格納されていますが、listItemの表示テキスト(発信者番号)は使用できません。リストビュー項目のpositionプロパティをSqliteの_idとして使用することはできません。項目が削除されると、autoincrementの_idが異なるためです。私はここで混乱しています。SimpleCursorAdapterを使用してSqliteから読み込まれたリストビュー項目のオーディオファイルパスを取得しますか?
MainActivity.Java:
import android.app.AlertDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.inputmethodservice.Keyboard;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class MainActivity extends AppCompatActivity {
TextView tvDate;
Button btnGet, btnShow;
ListView lv;
SharedPreferences prefs;
boolean isRunning = false;
DBSQL db;
TodoCursorAdapter adapter;
Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvDate = (TextView) findViewById(R.id.tvDate);
btnGet = (Button) findViewById(R.id.btnGet);
btnShow = (Button) findViewById(R.id.btnShow);
lv = (ListView) findViewById(R.id.lv);
db = new DBSQL(getApplicationContext());
prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("isRunning", isRunning);
editor.commit();
String currentTimeDate = DateFormat.getDateTimeInstance().format(new Date());
tvDate.setText(currentTimeDate);
btnShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(db.getLogsCount() != 0){
String fullData = db.getData();
showMessage("Full Database", fullData);
}else{
showMessage("Full Database", "Database is empty.");
}
}
});
}
public void populateListview(){
db = new DBSQL(MainActivity.this);
cursor = db.getAllData();
String[] from = new String[]{"displayname", "fileduration", "filedatetime"};
int[] to = new int[]{R.id.tvNumber, R.id.tvDuration, R.id.tvDateTime};
if (adapter == null){
SimpleCursorAdapter adapter = new SimpleCursorAdapter(MainActivity.this, R.layout.custom_listview, cursor, from, to, 0);
lv.setAdapter(adapter);
}else {
adapter.changeCursor(cursor);
}
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent it = new Intent(MainActivity.this, Player.class);
startActivity(it);
}
});
}
@Override
public void onResume() {
populateListview();
super.onResume();
}
public void showMessage(String title, String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(true);
builder.setTitle(title);
builder.setMessage(message);
builder.show();
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.setting) {
startActivity(new Intent(MainActivity.this, Setting.class));
return true;
} else if (id == R.id.about) {
Toast.makeText(this, "About Me", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
}
のSQLite:
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;
public class DBSQL extends SQLiteOpenHelper {
private static final String DATABASE_NAME="RecordedFiles";
private static final String DATABASE_TABLE="Files";
private static final int DATABASE_VERSION=3;
public static final String KEY_ROWID="_id";
public static final String KEY_FullName="filename";
public static final String KEY_ShortName="shortname";
public static final String KEY_DisplayName="displayname";
public static final String KEY_DateTime="filedatetime";
public static final String KEY_CallType="calltype";
public static final String KEY_Duration="fileduration";
private SQLiteDatabase ourDatabase;
public DBSQL(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("CREATE TABLE " + DATABASE_TABLE + "(" +
KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_FullName + " TEXT NOT NULL, " +
KEY_ShortName + " TEXT NOT NULL, " +
KEY_DisplayName + " TEXT NOT NULL, " +
KEY_DateTime + " TEXT NOT NULL, " +
KEY_CallType + " TEXT NOT NULL, " +
KEY_Duration + " TEXT NOT NULL);"
);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
onCreate(sqLiteDatabase);
}
public long addFile(String name, String duration, String datetime, String calltype) {
ourDatabase=this.getWritableDatabase();
ContentValues cv=new ContentValues();
String shortName = name.substring(name.lastIndexOf("/")+1);
String[] split = shortName.split("-");
String dispName = split[0];
cv.put(KEY_FullName, name);
cv.put(KEY_ShortName, shortName);
cv.put(KEY_DisplayName, dispName);
cv.put(KEY_DateTime, datetime);
cv.put(KEY_CallType, calltype);
cv.put(KEY_Duration, duration);
long id = ourDatabase.insert(DATABASE_TABLE, null, cv);
return id;
}
public String getData() {
ourDatabase = getWritableDatabase();
String[] columns=new String[]{KEY_ROWID,KEY_ShortName , KEY_DisplayName, KEY_Duration, KEY_DateTime, KEY_CallType};
Cursor c=ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
String result="";
int iRow=c.getColumnIndex(KEY_ROWID);
//int ifName = c.getColumnIndex(KEY_FullName);
int iName=c.getColumnIndex(KEY_ShortName);
int idur=c.getColumnIndex(KEY_Duration);
int iDate = c.getColumnIndex(KEY_DateTime);
int iType = c.getColumnIndex(KEY_CallType);
for (c.moveToFirst();!c.isAfterLast();c.moveToNext())
{
result= result + c.getString(iRow) + " " + c.getString(iName) + " "
+ c.getString(idur) + " seconds \n" + c.getString(iDate) + " \n" + c.getString(iType) + " \n";
}
return result;
}
public Cursor getAllData(){
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM Files", null);
return cursor;
}
public String getSingleDisplayName(int id) {
ourDatabase = getWritableDatabase();
Cursor c=ourDatabase.rawQuery("SELECT * FROM Files WHERE id='" + id + "'", null);
String result="";
int iDName=c.getColumnIndex(KEY_DisplayName);
if (c != null && c.moveToFirst()){
result= result + " " + c.getString(iDName) + "\n";
}
return result;
}
public long getSingleFileDuration(int id) {
ourDatabase = getWritableDatabase();
Cursor c=ourDatabase.rawQuery("SELECT * FROM Files WHERE id='" + id + "'", null);
long duration = 0;
int iDur=c.getColumnIndex(KEY_Duration);
if (c != null && c.moveToFirst()){
duration = c.getInt(iDur);
}
return duration;
}
public String getSingleFilePath(int id) {
ourDatabase = getWritableDatabase();
Cursor c=ourDatabase.rawQuery("SELECT * FROM Files WHERE id='" + id + "'", null);
String fullName = "";
int iName=c.getColumnIndex(KEY_FullName);
if (c != null && c.moveToFirst()){
fullName = c.getString(iName);
}
return fullName;
}
public String getSingleFileDateTime(int id) {
ourDatabase = getWritableDatabase();
Cursor c=ourDatabase.rawQuery("SELECT * FROM Files WHERE id='" + id + "'", null);
String fullName = "";
int iDateTime=c.getColumnIndex(KEY_DateTime);
if (c != null && c.moveToFirst()){
fullName = c.getString(iDateTime);
}
return fullName;
}
public String getSingleCallType(int id) {
ourDatabase = getWritableDatabase();
Cursor c=ourDatabase.rawQuery("SELECT * FROM Files WHERE id='" + id + "'", null);
String callkiType = "";
int iType=c.getColumnIndex(KEY_CallType);
if (c != null && c.moveToFirst()){
callkiType = c.getString(iType);
}
return callkiType;
}
public void delteSingleEntry(String uniqueId) {
ourDatabase = getWritableDatabase();
try{
ourDatabase.execSQL("delete from " + DATABASE_TABLE + " where uniqueid='" + uniqueId + "'");
}catch (Exception e){
Log.e("MyApp", e.toString());
}
}
public int getLogsCount(){
ourDatabase = getWritableDatabase();
int numRows = (int) DatabaseUtils.longForQuery(ourDatabase, "SELECT COUNT(*) FROM "+DATABASE_TABLE, null);
ourDatabase.close();
return numRows;
}
}
各記録のためのユニークなIDを生成し、他のデータを格納しながらデータベースに格納し、リスト項目のクリック時にIDとは独立した項目の一意のIDを取得し、発信者番号 – karthik
すべてのデータベースエントリの一意のIDですが、どのようにアイテムを取得できますか?アイテムは発信者の番号であり、簡単に複製することができます。 –
'onItemClick'呼び出し' Cursor c =(Cursor)adapterView.getAdapter()。getItem(i); DatabaseUtils.dumpCurrentRow(c); 'あなたはlogcatで何を見ますか? – pskink