2017-08-22 20 views
1

私のアプリは着信と発信を記録し、アプリケーションのホームディレクトリとファイルパス、ファイル名、期間、コールタイプを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; 

} 



} 
+0

各記録のためのユニークなIDを生成し、他のデータを格納しながらデータベースに格納し、リスト項目のクリック時にIDとは独立した項目の一意のIDを取得し、発信者番号 – karthik

+0

すべてのデータベースエントリの一意のIDですが、どのようにアイテムを取得できますか?アイテムは発信者の番号であり、簡単に複製することができます。 –

+0

'onItemClick'呼び出し' Cursor c =(Cursor)adapterView.getAdapter()。getItem(i); DatabaseUtils.dumpCurrentRow(c); 'あなたはlogcatで何を見ますか? – pskink

答えて

0

私はカーソルC =(カーソル)adapter.getItem(位置)を呼び出すことによって、それを持って、それは私にカーソルセットを与え、私が使用このカーソルは、自分の次のアクティビティでオーディオファイルを再生するためのファイルパスを取得するように設定されています。私が作成した

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
      Cursor c = (Cursor) adapter.getItem(position); 
      filepath = c.getString(c.getColumnIndex("filename")); 
      Intent it = new Intent(MainActivity.this, Player.class); 
      it.putExtra("filepath", filepath); 
      startActivity(it); 
     } 
    }); 
関連する問題