Reputation: 1336
Im in the process of making an app. My first activity displays several buttons. Each button should read out data from one table inside a database. I have the database inside the assets folder and also added the android metadata and _id to the database. In my main activity I am "importing" the db with following code:
public class DataBaseHelper extends SQLiteOpenHelper{
private static final String DB_PATH = "/data/data/com.mypackage/databases/";
private static final String DB_NAME = "dbname.sqlite";
private SQLiteDatabase myDataBase;
private final Context myContext;
/**
* Constructor
* Takes and keeps a reference of the passed context in order to access to the application assets and resources.
* @param context
*/
public DataBaseHelper(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
}
/**
* Creates a empty database on the system and rewrites it with your own database.
* */
public void createDataBase() throws IOException{
boolean dbExist = checkDataBase();
if(dbExist){
//do nothing - database already exist
}else{
//By calling this method and empty database will be created into the default system path
//of your application so we are gonna be able to overwrite that database with our database.
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
/**
* Check if the database already exist to avoid re-copying the file each time you open the application.
* @return true if it exists, false if it doesn't
*/
private boolean checkDataBase(){
SQLiteDatabase checkDB = null;
try{
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}catch(SQLiteException e){
//database does't exist yet.
}
if(checkDB != null){
checkDB.close();
}
return checkDB != null ? true : false;
}
/**
* Copies your database from your local assets-folder to the just created empty database in the
* system folder, from where it can be accessed and handled.
* This is done by transfering bytestream.
* */
private void copyDataBase() throws IOException{
//Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException{
//Open the database
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
@Override
public synchronized void close() {
if(myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
Is the above code sufficient? Will the database be available in other activities?
From my main activity now i would like to click example button "Plants". This should redirect me to the next activity and create a listview with all the plants names inside the plants table of the DB.
The redirect i am doing with following code:
Button plantsBtn = (Button) findViewById(R.id.button5);
plantsBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
// Intent myIntent = new Intent(view.getContext(), plantslist.class);
startActivityForResult(myIntent, 0);
}
});
Here is where im stuck. I dont know how to populate the listview with only the names now. Also after clicking on the plant name inside the listview i would like to go to another linear layout that displays all other details from the other columns in the same table for the specific plant clicked.
Inside the DB there are many tables with for example "cars" that will follow the same principle but i think if i can get it working for one table i am able to adapt it myself for the others.
I know there are a lot of tutorials out there already but i haven't really found one that makes me understand or adapt to my situation. Help would be greatly appreciated!
Upvotes: 0
Views: 445
Reputation: 485
To make myDataBase
available from all activities you can make your own application class that extends Application
, and declare it there. Then you can use a getter to retrieve it from your activities.
In regards to what you want to accomplish with the data from the database, I think you should look into Cursors
and CursorAdapter
(if you haven't already). Here is a good explanation of how to use it with Loaders
: http://developer.android.com/guide/components/loaders.html
You can find many tutorials with your friend Google :)
Upvotes: 1