Reputation: 31
I want to populate a listview from 2 tables in SQLite database. The listview will consist of 3views: an imageview and 2 textviews.
I can successfully query data from one table and display it in a listview, but have no idea how to query from the 2nd one, then add it to the list.
The codes below displays a listview with data only from my_folders.
How can I change it such that textview1 shows data from table my_folders and textview2 shows data from my_expenses. Can anyone please help?
public class mymain extends ListActivity { ListView listContent;
SimpleCursorAdapter cursorAdapter; final DBAdapter mySQLiteAdapter = new DBAdapter(this); Cursor cursor;
/** Called when the activity is first created. */
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.list_example);
listContent = (ListView) findViewById(R.id.custom_list); final DBAdapter mySQLiteAdapter = new DBAdapter(this); mySQLiteAdapter.open(); cursor = mySQLiteAdapter.getAllFolders(); String[] from = new String[] { DBAdapter.KEY_NAME,DBAdapter.KEY_CURRENCY }; int[] to = new int[] { R.id.name_row, R.id.notes_row }; cursorAdapter = new SimpleCursorAdapter(this, R.layout.list_row, cursor, from, to); setListAdapter(cursorAdapter); mySQLiteAdapter.close();
} }
import android.database.Cursor;
public class DBAdapter {
public static final String KEY_ROWID = "_id";
public static final String KEY_NAME = "name";
public static final String KEY_CURRENCY = "currency";
public static final String KEY_NOTES = "notes";
public static final String KEY_EXPENSE_NAME = "expense_name";
public static final String KEY_EXPENSE_AMOUNT = "expense_amount";
public static final String KEY_EXPENSE_DATE = "expense_date";
public static final String KEY_EXPENSE_TIME = "expense_time";
public static final String KEY_EXPENSE_NOTES = "expense_notes";
public static final String KEY_EFOLDERID = "e_fid";
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "MyDB";
private static final String DATABASE_TABLE1 = "my_folders";
private static final String DATABASE_TABLE2 = "my_expenses";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE_FOLDERS =
"create table my_folders (_id integer primary key autoincrement, "
+ "name text not null, currency text not null, notes text);";
private static final String DATABASE_CREATE_EXPENSES =
"create table my_expenses (_id integer primary key autoincrement, "
+ "expense_name text not null, expense_amount real not null, " +
"expense_date text not null, expense_time text not null," +
"expense_notes text,"
+ "e_fid integer not null," +
"FOREIGN KEY ("+ KEY_EFOLDERID+ ") REFERENCES " + DATABASE_TABLE1 +" ("+ >KEY_ROWID + ") ON DELETE CASCADE);";
// ---retrieves all the contacts---
public Cursor getAllFolders() {
return db.query(DATABASE_TABLE1, new String[] { KEY_ROWID, KEY_NAME,
KEY_CURRENCY, KEY_NOTES}, null, null, null, null, null);
}
// ---retrieves all the expenses---
public Cursor getAllExpenses() {
return db.query(DATABASE_TABLE2, new String[] { KEY_ROWID, KEY_EXPENSE_NAME,
KEY_EXPENSE_AMOUNT, KEY_EXPENSE_DATE, KEY_EXPENSE_TIME, KEY_EXPENSE_NOTES, >KEY_EFOLDERID}, null, null, null, null, null);
}
Upvotes: 2
Views: 1757
Reputation: 1364
The best way to get the data from the 2 tables is to use a join query, something like
SELECT name, expense_name, expense_notes
FROM my_folders, my_expenses
WHERE my_folders._id = my_folders.e_fid
This will return all the data in 1 Cursor and which you can then put in your view
Upvotes: 1