I have this problem with sqlite, i'm getting this warning:
A SQLiteConnection object for database '//data//data//com.compapps.booster//databases//booster.db' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
And logcat is showing that continuously, even after closing the app:
Database already exists
So i think the programm perform execution even if the app is closed, here is the code of my class:
package com.compapps.booster.db;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteConstraintException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import com.compapps.booster.model.AppInfo;
import com.compapps.booster.model.UsedAppInfo;
import com.compapps.booster.utill.Const;
public class ExternalDbOpenHelper extends SQLiteOpenHelper {
// Path to the device folder with databases
public static String DB_PATH;
// Database file name
public static String DB_NAME;
public SQLiteDatabase database;
public final Context context;
public SQLiteDatabase getDb() {
return database;
}
public ExternalDbOpenHelper(Context context, String databaseName,
int databaseVersion) {
super(context, databaseName, null, databaseVersion);
this.context = context;
// Write a full path to the databases of your application
String packageName = context.getPackageName();
DB_PATH = String.format("//data//data//%s//databases//", packageName);
DB_NAME = databaseName;
openDataBase();
}
// This piece of code will create a database if itï؟½s not yet created
public void createDataBase() {
boolean dbExist = checkDataBase();
if (!dbExist) {
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
Log.e(this.getClass().toString(), "Copying error");
throw new Error("Error copying database!");
}
} else {
Log.i(this.getClass().toString(), "Database already exists");
}
}
// Performing a database existence check
private boolean checkDataBase() {
SQLiteDatabase checkDb = null;
try {
String path = DB_PATH + DB_NAME;
checkDb = SQLiteDatabase.openDatabase(path, null,
SQLiteDatabase.OPEN_READONLY);
} catch (SQLException e) {
Log.e(this.getClass().toString(), "Error while checking db");
}
// Android doesnt like resource leaks, everything should
// be closed
if (checkDb != null) {
checkDb.close();
}
return checkDb != null;
}
// Method for copying the database
private void copyDataBase() throws IOException {
// Open a stream for reading from our ready-made database
// The stream source is located in the assets
InputStream externalDbStream = context.getAssets().open(DB_NAME);
// Path to the created empty database on your Android device
String outFileName = DB_PATH + DB_NAME;
// Now create a stream for writing the database byte by byte
OutputStream localDbStream = new FileOutputStream(outFileName);
// Copying the database
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = externalDbStream.read(buffer)) > 0) {
localDbStream.write(buffer, 0, bytesRead);
}
// Dont forget to close the streams
localDbStream.close();
externalDbStream.close();
}
public SQLiteDatabase openDataBase() throws SQLException {
String path = DB_PATH + DB_NAME;
if (database == null) {
createDataBase();
}
database = SQLiteDatabase.openDatabase(path, null,
SQLiteDatabase.OPEN_READWRITE);
return database;
}
#Override
public void onCreate(SQLiteDatabase db) {
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void insertAutoKillApps(final ArrayList<AppInfo> listAutoKillApps) {
for (int i = 0; i < listAutoKillApps.size(); i++) {
if (listAutoKillApps.get(i).isChecked()) {
AppInfo info = listAutoKillApps.get(i);
ContentValues values = new ContentValues();
values.put(Const.TblAutoKillColumn.APP_NAME, info.getAppName());
values.put(Const.TblAutoKillColumn.PACKAGE_NAME,
info.getPkgName());
values.put(Const.TblAutoKillColumn.PROCESS_ID,
info.getProcessId());
int id = (int) database.insert(Const.TABLE_AUTO_KILL, null,
values);
}
}
}
public int insertAutoKillApp(AppInfo info) {
ContentValues values = new ContentValues();
values.put(Const.TblAutoKillColumn.APP_NAME, info.getAppName());
values.put(Const.TblAutoKillColumn.PACKAGE_NAME, info.getPkgName());
// values.put(Const.TblAutoKillColumn.PROCESS_ID, info.getProcessId());
int id = (int) database.insert(Const.TABLE_AUTO_KILL, null, values);
return id;
}
public int insertAllAutoKillApp(ArrayList<AppInfo> list) {
int count = 0;
for (int i = 0; i < list.size(); i++) {
AppInfo info = list.get(i);
ContentValues values = new ContentValues();
values.put(Const.TblAutoKillColumn.APP_NAME, info.getAppName());
values.put(Const.TblAutoKillColumn.PACKAGE_NAME, info.getPkgName());
// values.put(Const.TblAutoKillColumn.PROCESS_ID,
// info.getProcessId());
int id = (int) database.insert(Const.TABLE_AUTO_KILL, null, values);
if (id != -1) {
count += 1;
}
}
System.out.println("Total app kill inserted " + count);
return count;
}
public boolean deleteAutoKillApp(AppInfo info) {
int row = database.delete(Const.TABLE_AUTO_KILL,
Const.TblAutoKillColumn.PACKAGE_NAME + " = ?",
new String[] { info.getPkgName() });
if (row != 0) {
return true;
}
return false;
}
public int deleteAllAutoKillApp(ArrayList<AppInfo> list) {
int count = 0;
for (int i = 0; i < list.size(); i++) {
AppInfo info = list.get(i);
int row = database.delete(Const.TABLE_AUTO_KILL,
Const.TblAutoKillColumn.PACKAGE_NAME + " = ?",
new String[] { info.getPkgName() });
if (row != 0) {
count += 1;
}
}
System.out.println("Total app kill deleted " + count);
return count;
}
public ArrayList<AppInfo> getAutoKillApps() {
ArrayList<AppInfo> appList = new ArrayList<AppInfo>();
String selectQuery = "SELECT * FROM " + Const.TABLE_AUTO_KILL;
Cursor cursor = database.rawQuery(selectQuery, null);
try {
if (cursor != null && cursor.getCount() > 0) {
if (cursor.moveToFirst()) {
do {
AppInfo info = new AppInfo();
info.setAppName(cursor.getString(0));
info.setPkgName(cursor.getString(1));
// info.setProcessId(cursor.getInt(2));
appList.add(info);
} while (cursor.moveToNext());
}
}
return appList;
} catch (Exception e) {
Log.d("Error in getting app auto kill from DB", e.getMessage());
return appList;
}
finally{
cursor.close();
}
}
public int insertUsedAppInfo(UsedAppInfo uAppInfo, boolean isUpdate) {
int id = 0;
if (isUpdate) {
ContentValues values = new ContentValues();
values.put(Const.TblAppUsedColumn.OPEN_COUNTER,
uAppInfo.getCounter());
values.put(Const.TblAppUsedColumn.OPEN_TIME, uAppInfo.getTime());
String[] args = new String[] { uAppInfo.getPackage_name() };
id = (int) database.update(Const.TABLE_APP_USED_DETAIL, values,
Const.TblAppUsedColumn.PACKAGE_NAME + "=?", args);
} else {
ContentValues values = new ContentValues();
values.put(Const.TblAppUsedColumn.PACKAGE_NAME,
uAppInfo.getPackage_name());
values.put(Const.TblAppUsedColumn.OPEN_COUNTER,
uAppInfo.getCounter());
values.put(Const.TblAppUsedColumn.OPEN_TIME, uAppInfo.getTime());
id = (int) database.insert(Const.TABLE_APP_USED_DETAIL, null,
values);
}
return id;
}
public UsedAppInfo gettUsedAppInfo(String packageName) {
UsedAppInfo uAppInfo = null;
String selectQuery = "SELECT * FROM " + Const.TABLE_APP_USED_DETAIL
+ " WHERE " + Const.TblAppUsedColumn.PACKAGE_NAME + " = "
+ "\"" + packageName + "\"";
System.out.println("Query coding: " + selectQuery);
try {
Cursor cursor = database.rawQuery(selectQuery, null);
if (cursor != null && cursor.getCount() > 0) {
if (cursor.moveToFirst()) {
uAppInfo = new UsedAppInfo();
uAppInfo.setPackage_name(cursor.getString(0));
uAppInfo.setCounter(cursor.getInt(1));
uAppInfo.setTime(cursor.getString(2));
}
cursor.close();
}
return uAppInfo;
} catch (Exception e) {
Log.d("Error in getting app info from db", e.getMessage());
return null;
}
}
#Override
public synchronized void close() {
if (database != null) {
database.close();
}
super.close();
}
}
Can I have help please, thanks!
Related
I am trying to create a quiz app where a category can be selected by clicking on a listView item. Each category has code like 0,1,2. For football, it is 0. After clicking on the football item, the app keeps on going to the home screen instead of logging the data I want. Please help me with the error.
Quiz Category Selection Class
String quizCategory = intent.getStringExtra("QuizCategory");
//Deciding which database to Open and choose
switch (quizCategory) {
case "0":
Log.i("Category", "Football");
Football football = new Football(this);
football.createDatabase();
football.openDatabase();
football.getWritableDatabase();
long x=football.getRowCount();
break;
default:
Log.i("Message", "Error");
}
}
Football Class
public class Football extends SQLiteOpenHelper {
private static final String Database_path = "/data/data/com.google.quiz/databases/";
private static final String Database_name = "football.db";
private static Context context;
private static final int version = 1;
public SQLiteDatabase sqlite;
public Football(Context context) {
super(context, Database_name, null, version);
this.context = context;
}
#Override
public void onCreate(SQLiteDatabase db) {
}
#Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
}
public void createDatabase() {
createDB();
}
private void createDB() {
boolean dbexist = DBexists();
if (!dbexist) {
this.getReadableDatabase();
copyDBfromResource();
}
}
private void copyDBfromResource() {
InputStream is;
OutputStream os;
String filePath = Database_path + Database_name;
try {
is = context.getAssets().open(Database_name);//reading purpose
os = new FileOutputStream(filePath);//writing purpose
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);//writing to file
}
os.flush();//flush the outputstream
is.close();//close the inputstream
os.close();//close the outputstream
} catch (IOException e) {
throw new Error("Problem copying database file:");
}
}
public void openDatabase() throws SQLException {
String myPath = Database_path + Database_name;
sqlite = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
private boolean DBexists() {
SQLiteDatabase db = null;
try {
String databasePath = Database_path + Database_name;
db = SQLiteDatabase.openDatabase(databasePath, null, SQLiteDatabase.OPEN_READWRITE);
db.setLocale(Locale.getDefault());
db.setVersion(1);
db.setLockingEnabled(true);
} catch (SQLException e) {
Log.e("Sqlite", "Database not found");
}
if (db != null)
db.close();///close the opened file
return db != null ? true : false;
}
public long getRowCount() {
SQLiteDatabase db = this.getReadableDatabase();
long x = DatabaseUtils.queryNumEntries(db, "football");
db.close();
return x;
}
}
i have an app that has database inside the assets folder.
But i want to get the database from my sdcard not from the assets, as i'm new to this, i did these steps :
I downloaded the new DB and put it inside the custom folder.
I changed the DB_PATH from
DB_PATH = "/data/data/com.test.project/databases/";
to
DB_PATH = Environment.getExternalStorageDirectory() + "/my_custom_folder/";
but when i try to access it, the app crashes , and that DB got deleted from my phone, any help ?
Here is the code to load it :
public class book_DB_Helper extends SQLiteOpenHelper {
public final static int DB_VERSION = 1;
private final static String DB_NAME = "my_book";
public static SQLiteDatabase db;
//// --- the old PATH 'from assets folder
//private static String DB_PATH = "/data/data/com.test.project/databases/";
//// --- my new path in the sdcard
private static String DB_PATH = Environment.getExternalStorageDirectory() + "/my_folder/";
private final Context context;
private final String TABLE_NAME = "tbl_recipes";
private final String ID = "id";
private final String RECIPE_NAME = "recipe_name";
private final String IMAGE_PREVIEW = "image_preview";
private final String COOK_TIME = "cook_time";
public my_book_DB_Helper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.context = context;
}
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
SQLiteDatabase db_Read = null;
if (dbExist) {
//do nothing - database already exist
deleteDataBase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
} else {
db_Read = this.getReadableDatabase();
db_Read.close();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private void deleteDataBase() {
File dbFile = new File(DB_PATH + DB_NAME);
dbFile.delete();
}
private boolean checkDataBase() {
File dbFile = new File(DB_PATH + DB_NAME);
return dbFile.exists();
}
private void copyDataBase() throws IOException {
InputStream myInput = context.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException {
String myPath = DB_PATH + DB_NAME;
db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
#Override
public void close() {
db.close();
}
#Override
public void onCreate(SQLiteDatabase db) {
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public ArrayList<ArrayList<Object>> getAllData(String RecipeNameKeyword) {
ArrayList<ArrayList<Object>> dataArrays = new ArrayList<ArrayList<Object>>();
Cursor cursor = null;
if (RecipeNameKeyword.equals("")) {
try {
cursor = db.query(
TABLE_NAME,
new String[]{ID, RECIPE_NAME, IMAGE_PREVIEW, COOK_TIME},
null, null, null, null, null);
cursor.moveToFirst();
if (!cursor.isAfterLast()) {
do {
ArrayList<Object> dataList = new ArrayList<Object>();
dataList.add(cursor.getLong(0));
dataList.add(cursor.getString(1));
dataList.add(cursor.getString(2));
dataList.add(cursor.getString(3));
dataArrays.add(dataList);
}
while (cursor.moveToNext());
}
cursor.close();
} catch (SQLException e) {
Log.e("DB Error", e.toString());
e.printStackTrace();
}
} else {
try {
cursor = db.query(
TABLE_NAME,
new String[]{ID, RECIPE_NAME, IMAGE_PREVIEW, COOK_TIME},
RECIPE_NAME + " LIKE '%" + RecipeNameKeyword + "%'",
null, null, null, null);
cursor.moveToFirst();
if (!cursor.isAfterLast()) {
do {
ArrayList<Object> dataList = new ArrayList<Object>();
dataList.add(cursor.getLong(0));
dataList.add(cursor.getString(1));
dataList.add(cursor.getString(2));
dataList.add(cursor.getString(3));
dataArrays.add(dataList);
}
while (cursor.moveToNext());
}
cursor.close();
} catch (SQLException e) {
Log.e("DB Error", e.toString());
e.printStackTrace();
}
}
return dataArrays;
}
public ArrayList<Object> getDetail(long id) {
ArrayList<Object> rowArray = new ArrayList<Object>();
Cursor cursor;
try {
String SUMMARY = "summary";
String PREP_TIME = "prepare_time";
String SERVES = "serves";
String INGREDIENTS = "ingredients";
String DIRECTIONS = "directions";
cursor = db.query(
TABLE_NAME,
new String[]{RECIPE_NAME, IMAGE_PREVIEW, COOK_TIME},
ID + "=" + id,
null, null, null, null, null);
cursor.moveToFirst();
if (!cursor.isAfterLast()) {
do {
rowArray.add(cursor.getString(0));
rowArray.add(cursor.getString(1));
rowArray.add(cursor.getString(2));
rowArray.add(cursor.getString(3));
rowArray.add(cursor.getString(4));
rowArray.add(cursor.getString(5));
rowArray.add(cursor.getString(6));
rowArray.add(cursor.getString(7));
}
while (cursor.moveToNext());
}
cursor.close();
} catch (SQLException e) {
Log.e("DB ERROR", e.toString());
e.printStackTrace();
}
return rowArray;
}
}
yoh...
I was trying to retrieve data from my external database in assets
but when I run the app, seems like it created another database in /data/data/packagename/databases/ :-( not the external database from assets I inserted and causing an error(Unfortunately, App has stopped). Here's my Code:
ingameinterface .java*
public class ingameinterface extends Activity {
DBHelper dbhelper;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ingameinterface);
String[] from = new String[] { "CtrlNo", "Prima", "Key_Word", "Val" };
int[] to = new int[] { R.id.itmCc1, R.id.itmCc2, R.id.itemCc3, R.id.itemCc4};
dbhelper = new DBHelper(this);
try {
dbhelper.createDataBase();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Cursor c = dbhelper.getData();
if (c.getCount() == 0) {
showmessage("Error!", "Nothing found.");
return;
}
StringBuffer buff = new StringBuffer();
while (c.moveToNext()) {
buff.append("Controlnum: " + c.getString(0) + "\n");
buff.append("Prima: " + c.getString(1) + "\n");
buff.append("Word: " + c.getString(2) + "\n");
buff.append("Value: " + c.getString(3) + "\n\n");
}
showmessage("Data", buff.toString());
}
public void showmessage(String title, String Message){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(true);
builder.setTitle(title);
builder.setMessage(Message);
}
}
and
DBHelper.Java*
public class DBHelper extends SQLiteOpenHelper {
private static String DB_NAME = "db_vocabulary";
private SQLiteDatabase db;
private final Context context;
private String DB_PATH;
public DBHelper(Context context) {
super(context, DB_NAME, null, 1);
this.context = context;
DB_PATH = "/data/data/" + context.getPackageName() + "/" + "databases/";
}
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
} else {
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
// throw new Error("Error copying database");
}
}
}
private boolean checkDataBase() {
File dbFile = new File(DB_PATH + DB_NAME);
return dbFile.exists();
}
private void copyDataBase() throws IOException {
InputStream myInput = context.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
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 Cursor getData() {
String myPath = DB_PATH + DB_NAME;
db = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READONLY);
Cursor c = db.rawQuery("SELECT * FROM TblWords WHERE Prima = 1", null);
return c;
}
#Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
use this in your DBHelper.java file:
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists "+TABLE_NAME+"(PHONENUMBER VARCHAR,NAME VARCHAR)");
}
so that it will wont create another table if already that table exits in database.
In my Android application I created a database using sqlite browser and cpoied it into asset folder. then I created a table named EMPerson.
I need to add user defined data(user can insert details such as personName,date_of_birth,age,gender & bloodGrp) into this EMPerson table when the user click save button.
My DBHelper class is like this.
package my.easymedi.db;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import my.easymedi.entity.Person;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;
public class DBHelper extends SQLiteOpenHelper {
/*Database attributes - the Android's default system path for your application database*/
private static final String pkg = "my.easymedi.controller";
private static String DB_PATH = "/data/data/" + pkg + "/databases/";
private static String DB_NAME = "EasyMediInfo.jpeg";
private static final int DB_VERSION = 1;
private final Context myContext;
private SQLiteDatabase myDatabase;
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.myContext = context;
}
public void createDataBase() {
boolean dbExist = checkDataBase();
if (dbExist) {
// do nothing - database already exist
} else {
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
Toast.makeText(myContext, e.getMessage(), Toast.LENGTH_SHORT).show();
Log.d("CREATE_DB", e.getMessage());
}
}
}
private void copyDataBase() throws IOException {
InputStream databaseInput = null;
String outFileName = DB_PATH + DB_NAME; //path to copy the database
OutputStream databaseOutput = new FileOutputStream(outFileName); //open the empty db as an output stream
databaseInput = myContext.getAssets().open(DB_NAME);
byte[] buffer = new byte[512];
int length = databaseInput.read(buffer);
while(length > 0){
databaseOutput.write(buffer, 0, length);
databaseOutput.flush();
}
databaseOutput.flush();
databaseInput.close();
databaseOutput.close();
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
} catch (SQLiteException e) {
Toast.makeText(myContext, e.getMessage(), Toast.LENGTH_SHORT).show();
Log.d("Check_DB", e.getMessage());
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
public void openDatabase() {
String myPath = DB_PATH + DB_NAME;
myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
}
public void closeDatabase() {
if(myDatabase != null){
myDatabase.close();
}
}
#Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
public boolean insertIntoDatabase(Person person) {
String query = "INSERT INTO EMPerson (COLUMN_PERSON_NAME, COLUMN_DOB , COLUMN_AGE, COLUMN_GENDER, COLUMN_BLOODGRP) "
+ " VALUES ('" + person.getName() + "', '" + person.getDate_of_birth() + "', '" + person.getAge() + "', '" + person.getGender() + "', '" + person.getBloodGrp() + "')";
try {
myDatabase.execSQL(query);
return true;
} catch (Exception e) {
return false;
}
}
}
And this is my AddNewPerson class segment.
#Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnSave:
personName = etName.getText().toString();
date_of_birth = tvDOB.getText().toString();
age = tvAge.getText().toString();
int selected_rb_ID = genderGrp.getCheckedRadioButtonId();
RadioButton rb = (RadioButton) findViewById(selected_rb_ID);
gender = rb.getText().toString();
bloodGrp = spiBloodGrp.getSelectedItem().toString();
Person person = new Person();
person.setName(personName);
person.setDate_of_birth(date_of_birth);
person.setAge(age);
person.setGender(gender);
person.setBloodGrp(bloodGrp);
//personArrayList.add(person);
DBHelper dbHelper = new DBHelper(this);
dbHelper.createDataBase();
dbHelper.openDatabase();
//SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
boolean flag = dbHelper.insertIntoDatabase(person);
//long affectedColumnId = sqliteDatabase.insert(AndroidOpenDbHelper.TABLE_NAME_GPA, null, contentValues);
if(flag){
Toast.makeText(getApplicationContext(), "Values inserted", Toast.LENGTH_SHORT).show();
}
dbHelper.closeDatabase();
break;
When I run the application log cat says 'no such table:EMPerson'
Can anyone plz explain what's wrong with these codes.
Thanx in advance
There seem to be two problems:
Change the extension of your database to ".db" from ".jpeg" (just a suggestion for good coding practice)
It seems you do not properly initialize "mydatabase" variable in your code:
The line:
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
should be calling this.openDatabase(...)
Similarly, when your database doesn't exist you copy the database but doesn't initialize mydatabase again (you should call openDatabase again)
Also, you can then modify the function openDatabase as
public boolean openDatabase() {
String myPath = DB_PATH + DB_NAME;
myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
return myDatabase!= null ? true : false;
}
Change the DB_NAME to EasyMediInfo.db in Assets
B/coz the extension of Database file is .db
private static String DB_NAME = "EasyMediInfo.db";
Edited:-
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.myContext = context;
if (android.os.Build.VERSION.SDK_INT >= 4.2) {
DB_PATH = myContext.getApplicationInfo().dataDir
+ "/databases/";
} else {
DB_PATH = "/data/data/" + myContext.getPackageName()
+ "/databases/";
}
}
here is my problem. I am creating my database of text in program called SqliteDbBrowser after that I want to put it into /assets/ folder in android and load it to the application.
All the tutorials assume that you don't have any database and you create it clean from application and then fill it.
I have already put data into my database and don't want to create new one.
Here is some guy's tutorial http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ and it somehow work's but it's not perfect, is it any other way to solve this ? Using ony SQLiteOpenHelper not mixing stuff?
public void getDataBaseData() {
// /PawnStorescopy.db
if (!new File("/data/data/" + this.getPackageName()
+ "/PawnStorescopy.sqlite").exists()) {
try {
FileOutputStream out = new FileOutputStream("data/data/"
+ this.getPackageName() + "DatabaseName.sqlite");
InputStream in = getAssets().open("DatabaseName.db");
byte[] buffer = new byte[1024];
int readBytes = 0;
while ((readBytes = in.read(buffer)) != -1)
out.write(buffer, 0, readBytes);
in.close();
// out.close();
} catch (IOException e) {
}
}
SQLiteDatabase sqliteDB = SQLiteDatabase.openOrCreateDatabase(
"/data/data/" + this.getPackageName()
+ "/DatabaseName.sqlite", null);
Cursor cursor = sqliteDB.rawQuery("SELECT * FROM TableName", null);
if (cursor.moveToFirst()) {
do {
////Get Data
} while (cursor.moveToNext());
imageFilter(listDatabase);
}
}
I don't see the problem. I used that same example and it worked.
In my project I had to check and, eventually, load the missing tables on the internal DB.
The DB will not be erased, unless you state so.
Therefore adding new tables will not erase any pre-existing ones.
Anyway, you said 'it somehow work's but it's not perfect', what do you mean? It either copies the tables or it doesn't. Right?
The example you provided a link for works well, but the best practice is to build your database within your android application, so you can export the ready database DLL with the data as insert statements, add those insert statements in a file let say under your raw folder and after creating the DB you can read the insert statements and execute them to have your data inserted.
First Put your Created Database in your Asset Folder.
Add Below Java File to your Project
package com.app.ourforms.database;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Vector;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBConnect extends SQLiteOpenHelper {
ArrayList<String> arraylistUrl;
public int GetCursor;
public DBConnect(Context context, String db_name) {
super(context, db_name, null, 2);
if (db != null && db.isOpen())
close();
this.myContext = context;
DB_NAME = db_name;
try {
createDataBase();
openDataBase();
} catch (IOException e) {
// System.out.println("Exception in creation of database : "+
// e.getMessage());
e.printStackTrace();
}
}
public void createDataBase() throws IOException {
// boolean dbExist = checkDataBase();
boolean dbExist = databaseExist();
if (dbExist) {
// System.out.println("Database Exist");
} else {
this.getReadableDatabase();
try {
copyDatabase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private void copyDatabase() throws IOException {
InputStream input = myContext.getAssets().open(DB_NAME);
String outputFileName = DB_PATH + DB_NAME;
OutputStream output = new FileOutputStream(outputFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
// Close the streams
output.flush();
output.close();
input.close();
// System.out.println(DB_NAME + "Database Copied !");
}
#Override
public void onCreate(SQLiteDatabase db) {
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void openDataBase() throws SQLException {
// Open the database
String myPath = DB_PATH + DB_NAME;
db = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
}
public boolean isOpen() {
if (db != null)
return db.isOpen();
return false;
}
#Override
public synchronized void close() {
if (db != null)
db.close();
super.close();
}
public boolean databaseExist() {
File dbFile = new File(DB_PATH + DB_NAME);
return dbFile.exists();
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
// System.out.println("My Pathe is:- " + myPath);
// System.out.println("Open");
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
// System.out.println("checkDB value:" + checkDB);
// System.out.println("My Pathe is:- " + myPath);
} catch (Exception e) {
// database does't exist yet.
}
if (checkDB != null) {
// System.out.println("Closed");
checkDB.close();
// System.out.println("My db is:- " + checkDB.isOpen());
}
return checkDB != null ? true : false;
}
public Cursor execCursorQuery(String sql) {
Cursor cursor = null;
try {
cursor = db.rawQuery(sql, null);
GetCursor = cursor.getCount();
Log.i("Inside execCursorQuery try", sql);
} catch (Exception e) {
Log.i("Inside execCursorQuery exception", e.getMessage());
}
return cursor;
}
public void execNonQuery(String sql) {
try {
db.execSQL(sql);
// Log.d("SQL", sql);
} catch (Exception e) {
// Log.e("Err", e.getMessage());
} finally {
// closeDb();
}
}
// ****************** Declare all the global variable
// ****************************//
private Context myContext;
public String DB_PATH = "data/data/com.app.ourforms/databases/"; // path
// of
// your
// datbase
public static String DB_NAME = "OurForms.sqlite";// your database
// name
#SuppressWarnings("unused")
private static String ASSETS_DB_FOLDER = "db";
private SQLiteDatabase db;
public Vector<ArrayList<String>> getQuestion(String Query) {
Vector<ArrayList<String>> alldata = new Vector<ArrayList<String>>();
ArrayList<String> Question = new ArrayList<String>();
ArrayList<String> Option1 = new ArrayList<String>();
ArrayList<String> Option2 = new ArrayList<String>();
ArrayList<String> Option3 = new ArrayList<String>();
ArrayList<String> Option4 = new ArrayList<String>();
ArrayList<String> Option5 = new ArrayList<String>();
ArrayList<String> correct = new ArrayList<String>();
ArrayList<String> correctness = new ArrayList<String>();
ArrayList<String> Description = new ArrayList<String>();
Cursor alldata_ques = execCursorQuery(Query);
// GetCursor = alldata_ques.getCount();
if (alldata_ques != null) {
Log.e("Cursor length", "" + alldata_ques.getCount());
GetCursor = alldata_ques.getCount();
if (alldata_ques.getCount() > 0)
while (alldata_ques.moveToNext()) {
Question.add((alldata_ques.getString(alldata_ques
.getColumnIndex("Question"))));
Option1.add(alldata_ques.getString(alldata_ques
.getColumnIndex("A")));
Option2.add(alldata_ques.getString(alldata_ques
.getColumnIndex("B")));
Option3.add(alldata_ques.getString(alldata_ques
.getColumnIndex("C")));
Option4.add(alldata_ques.getString(alldata_ques
.getColumnIndex("D")));
Option5.add(alldata_ques.getString(alldata_ques
.getColumnIndex("E")));
correct.add(alldata_ques.getString(alldata_ques
.getColumnIndex("Answer")));
correctness.add(alldata_ques.getString(alldata_ques
.getColumnIndex("Correctness")));
Description.add(alldata_ques.getString(alldata_ques
.getColumnIndex("Description")));
}
alldata.add(Question);
alldata.add(Option1);
alldata.add(Option2);
alldata.add(Option3);
alldata.add(Option4);
alldata.add(Option5);
alldata.add(correct);
alldata.add(correctness);
alldata.add(Description);
// Log.d("VECTORSIZE", String.valueOf(alldata.size()));
}
return alldata;
}
public Vector<ArrayList<String>> getQuestions(String Query) {
Vector<ArrayList<String>> alldata = new Vector<ArrayList<String>>();
ArrayList<String> Question = new ArrayList<String>();
ArrayList<String> Option1 = new ArrayList<String>();
ArrayList<String> Option2 = new ArrayList<String>();
ArrayList<String> Option3 = new ArrayList<String>();
ArrayList<String> Option4 = new ArrayList<String>();
ArrayList<String> Option5 = new ArrayList<String>();
ArrayList<String> correct = new ArrayList<String>();
ArrayList<String> Description = new ArrayList<String>();
Cursor alldata_ques = execCursorQuery(Query);
if (alldata_ques != null) {
Log.e("Cursor length", "" + alldata_ques.getCount());
if (alldata_ques.getCount() > 0)
GetCursor = alldata_ques.getCount();
while (alldata_ques.moveToNext()) {
Question.add((alldata_ques.getString(alldata_ques
.getColumnIndex("Question"))));
Option1.add(alldata_ques.getString(alldata_ques
.getColumnIndex("A")));
Option2.add(alldata_ques.getString(alldata_ques
.getColumnIndex("B")));
Option3.add(alldata_ques.getString(alldata_ques
.getColumnIndex("C")));
Option4.add(alldata_ques.getString(alldata_ques
.getColumnIndex("D")));
Option5.add(alldata_ques.getString(alldata_ques
.getColumnIndex("E")));
correct.add(alldata_ques.getString(alldata_ques
.getColumnIndex("Answer")));
Description.add(alldata_ques.getString(alldata_ques
.getColumnIndex("Description")));
}
alldata.add(Question);
alldata.add(Option1);
alldata.add(Option2);
alldata.add(Option3);
alldata.add(Option4);
alldata.add(Option5);
alldata.add(correct);
alldata.add(Description);
// Log.d("VECTORSIZE", String.valueOf(alldata.size()));
}
return alldata;
}
}
In Above Code Change below line as per your project:
public String DB_PATH = "data/data/YOUR_PACKAGE_NAME/databases/"; // path of your datbase
public static String DB_NAME = "OurForms.sqlite";// your database Name
Inside your Activity Write Below Code For First Time Copy your Database to Application.
// For Database Copy
myPrefs = getSharedPreferences("myPrefs", 0);
// sharedPreferences = PreferenceManager
// .getDefaultSharedPreferences(getApplicationContext());
Data.FIRST_TIME_LAUNCH = myPrefs.getBoolean("FIRST_TIME_LAUNCH", true);
if (Data.FIRST_TIME_LAUNCH) {
Log.i(TAG, "FIRST TIME*************************");
dbConnect = new DBConnect(getApplicationContext(),
"OurForms.sqlite");
SharedPreferences.Editor editor = myPrefs.edit();
editor.putBoolean("FIRST_TIME_LAUNCH", false);
editor.commit();
}
Hope it will help you.
Follow this link:
https://github.com/jgilfelt/android-sqlite-asset-helper
Then,
Add your yourSqliteDb.db to folder in assets/databases. Create the folders if not present.
assets/databases/yourSqliteDb.db
How to create asset folder:
http://code2care.org/2015/create-assets-folder-in-android-studio/
Create SQLiteAssetHelper Class as:
public class MyDatabaseHelper extends SQLiteAssetHelper {
private static final String DATABASE_NAME = "yourSqliteDb.db";
private static final int DATABASE_VERSION = 1;
public MyDatabase(Context mContext)
{
super(mContext, DATABASE_NAME, null, DATABASE_VERSION );
}
public Cursor getItems()
{
SQLiteDatabase db = getReadableDatabase();
Cursor c = db.rawQuery("Select * from items", null);
//items is a column name in your table in database
c.moveToFirst();
return c;
}
}
Now in MainActivity or wherever you need to read data from database,
MyDatabaseHelper myDbHelper = new MyDatabaseHelper(this);
SQLiteDatabase db = myDbHelper.ReadableDatabase();
String items = getResult(1); //number value from database table
public String getResult(int id)
{
String name = null;
try
{
Cursor c = null;
c = db.rawQuery("select item from items where _id="+id, null);
c.moveToFirst();
name = c.getString(c.getColumnIndex("item"));
c.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return name;
}