How to export Excel sheet from SQLite Database in android studio - java

so I'm developing this app which uses SQLite database and displays it in a TableLayout in android studio. Now I want a button to export the data in the TableLayout to an Excel sheet. I'm using this library to do it: https://github.com/androidmads/SQLite2XL
and my database doesn't have a name for it. This is my DBHelper.java:-
package com.kbjg.frissco.eattendence;
import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;
import androidx.annotation.Nullable;
import java.util.PrimitiveIterator;
public class DBHelper extends SQLiteOpenHelper {
private static final int VERSION = 2;
//class table
public static final String CLASS_TABLE_NAME = "CLASS_TABLE";
public static final String C_ID = "_CID";
public static final String CLASS_NAME_KEY = "CLASS_NAME";
public static final String SUBJECT_NAME_KEY = "SUBJECT_NAME";
private static final String CREATE_CLASS_TABLE =
"CREATE TABLE " + CLASS_TABLE_NAME + "( " +
C_ID + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
CLASS_NAME_KEY + " TEXT NOT NULL, " +
SUBJECT_NAME_KEY + " TEXT NOT NULL, " +
"UNIQUE (" + CLASS_NAME_KEY + "," + SUBJECT_NAME_KEY + ")" +
");";
private static final String DROP_CLASS_TABLE = "DROP TABLE IF EXISTS " + CLASS_TABLE_NAME;
private static final String SELECT_CLASS_TABLE = "SELECT * FROM " + CLASS_TABLE_NAME;
//student table
private static final String STUDENT_TABLE_NAME = "STUDENT_TABLE";
public static final String S_ID = "_SID";
public static final String STUDENT_NAME_KEY = "STUDENT_NAME";
public static final String STUDENT_ROLL_KEY = "ROLL";
private static final String CREATE_STUDENT_TABLE =
"CREATE TABLE " + STUDENT_TABLE_NAME +
"( " +
S_ID + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
C_ID + " INTEGER NOT NULL, " +
STUDENT_NAME_KEY + " TEXT NOT NULL, " +
STUDENT_ROLL_KEY + " INTEGER, " +
" FOREIGN KEY ( " + C_ID + ") REFERENCES " + CLASS_TABLE_NAME + "(" + C_ID + ")" +
");";
private static final String DROP_STUDENT_TABLE = "DROP TABLE IF EXISTS " + STUDENT_TABLE_NAME;
private static final String SELECT_STUDENT_TABLE = "SELECT * FROM " + STUDENT_TABLE_NAME;
//STATUS TABLE
private static final String STATUS_TABLE_NAME = "STATUS_TABLE";
public static final String STATUS_ID = "_STATUS_ID";
public static final String DATE_KEY = "STATUS_DATE";
public static final String STATUS_KEY = "STATUS";
private static final String CREATE_STATUS_TABLE =
"CREATE TABLE " + STATUS_TABLE_NAME +
"(" +
STATUS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
S_ID + " INTEGER NOT NULL, " +
C_ID + " INTEGER NOT NULL, " +
DATE_KEY + " DATE NOT NULL, " +
STATUS_KEY + " TEXT NOT NULL, " +
" UNIQUE (" + S_ID + "," + DATE_KEY + ")," +
" FOREIGN KEY (" + S_ID + ") REFERENCES " + STUDENT_TABLE_NAME + "( " + S_ID + ")," +
" FOREIGN KEY (" + C_ID + ") REFERENCES " + CLASS_TABLE_NAME + "( " + C_ID + ")" +
");";
private static final String DROP_STATUS_TABLE = "DROP TABLE IF EXISTS " + STATUS_TABLE_NAME;
private static final String SELECT_STATUS_TABLE = "SELECT * FROM " + STATUS_TABLE_NAME;
public DBHelper(#Nullable Context context) {
super(context, "Attendance.db", null, VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_CLASS_TABLE);
db.execSQL(CREATE_STUDENT_TABLE);
db.execSQL(CREATE_STATUS_TABLE);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
db.execSQL(DROP_CLASS_TABLE);
db.execSQL(DROP_STUDENT_TABLE);
db.execSQL(DROP_STATUS_TABLE);
} catch (SQLException e) {
e.printStackTrace();
}
}
long addClass(String className,String subjectName){
SQLiteDatabase database = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(CLASS_NAME_KEY,className);
values.put(SUBJECT_NAME_KEY,subjectName);
return database.insert(CLASS_TABLE_NAME,null,values);
}
Cursor getClassTable(){
SQLiteDatabase database = this.getReadableDatabase();
return database.rawQuery(SELECT_CLASS_TABLE,null);
}
int deleteClass(long cid){
SQLiteDatabase database = this.getReadableDatabase();
return database.delete(CLASS_TABLE_NAME,C_ID+"=?",new String[]{String.valueOf(cid)});
}
long updateClass(long cid,String className,String subjectName){
SQLiteDatabase database = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(CLASS_NAME_KEY,className);
values.put(SUBJECT_NAME_KEY,subjectName);
return database.update(CLASS_TABLE_NAME,values,C_ID+"=?",new String[]{String.valueOf(cid)});
}
long addStudent(long cid,int roll,String name){
SQLiteDatabase database = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(C_ID,cid);
values.put(STUDENT_ROLL_KEY,roll);
values.put(STUDENT_NAME_KEY,name);
return database.insert(STUDENT_TABLE_NAME,null,values);
}
Cursor getStudentTable(long cid){
SQLiteDatabase database = this.getReadableDatabase();
return database.query(STUDENT_TABLE_NAME,null,C_ID+"=?",new String[]{String.valueOf(cid)},null,null,STUDENT_ROLL_KEY);
}
int deleteStudent(long sid){
SQLiteDatabase database = this.getReadableDatabase();
return database.delete(STUDENT_TABLE_NAME,S_ID+"=?",new String[]{String.valueOf(sid)});
}
long updateStudent(long sid,String name){
SQLiteDatabase database = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(STUDENT_NAME_KEY,name);
return database.update(STUDENT_TABLE_NAME,values,S_ID+"=?",new String[]{String.valueOf(sid)});
}
long addStatus(long sid,long cid, String date, String status){
SQLiteDatabase database = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(S_ID,sid);
values.put(C_ID,cid);
values.put(DATE_KEY,date);
values.put(STATUS_KEY,status);
return database.insert(STATUS_TABLE_NAME,null,values);
}
long updateStatus(long sid,String date,String status){
SQLiteDatabase database = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(STATUS_KEY,status);
String whereClause = DATE_KEY +"='"+date+"' AND "+S_ID+"="+sid;
return database.update(STATUS_TABLE_NAME,values,whereClause,null);
}
#SuppressLint("Range")
String getStatus(long sid, String date){
String status=null;
SQLiteDatabase database = this.getReadableDatabase();
String whereClause = DATE_KEY +"='"+date+"' AND "+S_ID+"="+sid;
Cursor cursor = database.query(STATUS_TABLE_NAME,null,whereClause,null,null,null,null);
if(cursor.moveToFirst()) {
status = cursor.getString(cursor.getColumnIndex(STATUS_KEY));
}
return status;
}
Cursor getDistinctMonths(long cid){
SQLiteDatabase database = this.getReadableDatabase();
return database.query(STATUS_TABLE_NAME,new String[]{DATE_KEY},C_ID+"="+cid,null,"substr("+DATE_KEY+",4,7)",null,null);//23.01.2022
}
}
and this is the code I used to generate the Excel sheet:-
csv_maker.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(final View view) {
String directory_path = Environment.getExternalStorageDirectory().getPath() + "/Project Brown/";
File file = new File(directory_path);
if (!file.exists()) {
file.mkdirs();
}
// Export SQLite DB as EXCEL FILE
SQLiteToExcel sqliteToExcel = new SQLiteToExcel(getApplicationContext(), DBHelper.CLASS_NAME_KEY);
sqliteToExcel.exportAllTables("users.xls", new SQLiteToExcel.ExportListener() {
#Override
public void onStart() {
}
#Override
public void onCompleted(String filePath) {
Toast.makeText(SheetActivity.this, "Excel Exported", Toast.LENGTH_SHORT).show();;
}
#Override
public void onError(Exception e) {
}
});
}
});
Actually what happening is when I click the button a directory is created but the is not generated. Kindly help me. Thanks in Advance.

Related

How do i call sqlite methods through Viewmodel?

I searched everywhere but i didnt found any info or tutorial or blogs regarding sqlite with MVVM. how do i create viewmodel for my sqlite methods? i have tried various ways to access it, but gives me error
following is my code for sqlite helper class
public class DbHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 2;
static final String DATABASE_NAME = "kuncorosqlite.db";
public static final String TABLE_SQLite = "sqlite";
public static final String COLUMN_ID = "id";
public static final String COLUMN_NAME = "name";
public static final String COLUMN_ADDRESS = "address";
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
final String SQL_CREATE_MOVIE_TABLE = "CREATE TABLE " + TABLE_SQLite + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY autoincrement, " +
COLUMN_NAME + " TEXT NOT NULL, " +
COLUMN_ADDRESS + " TEXT NOT NULL" +
" )";
db.execSQL(SQL_CREATE_MOVIE_TABLE);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_SQLite);
onCreate(db);
}
public ArrayList<HashMap<String, String>> getAllData() {
ArrayList<HashMap<String, String>> wordList;
wordList = new ArrayList<HashMap<String, String>>();
String selectQuery = "SELECT * FROM " + TABLE_SQLite;
SQLiteDatabase database = this.getWritableDatabase();
Cursor cursor = database.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
HashMap<String, String> map = new HashMap<String, String>();
map.put(COLUMN_ID, cursor.getString(0));
map.put(COLUMN_NAME, cursor.getString(1));
map.put(COLUMN_ADDRESS, cursor.getString(2));
wordList.add(map);
} while (cursor.moveToNext());
}
Log.e("select sqlite ", "" + wordList);
database.close();
return wordList;
}
public void insert(String name, String address) {
SQLiteDatabase database = this.getWritableDatabase();
String queryValues = "INSERT INTO " + TABLE_SQLite + " (name, address) " +
"VALUES ('" + name + "', '" + address + "')";
Log.e("insert sqlite ", "" + queryValues);
database.execSQL(queryValues);
database.close();
}
public void update(int id, String name, String address) {
SQLiteDatabase database = this.getWritableDatabase();
String updateQuery = "UPDATE " + TABLE_SQLite + " SET "
+ COLUMN_NAME + "='" + name + "', "
+ COLUMN_ADDRESS + "='" + address + "'"
+ " WHERE " + COLUMN_ID + "=" + "'" + id + "'";
Log.e("update sqlite ", updateQuery);
database.execSQL(updateQuery);
database.close();
}
public void delete(int id) {
SQLiteDatabase database = this.getWritableDatabase();
String updateQuery = "DELETE FROM " + TABLE_SQLite + " WHERE " + COLUMN_ID + "=" + "'" + id + "'";
Log.e("update sqlite ", updateQuery);
database.execSQL(updateQuery);
database.close();
}
}
viewmodel so far till now what ihave tried :-
public class Viewmodell extends AndroidViewModel {
private DbHelper repository ;
MutableLiveData<ArrayList<HashMap<String, String>>> allNotesLivedata;
public Viewmodell(#NonNull Application application) {
super(application);
repository = new DbHelper(application);
allNotesLivedata = repository.getAllData();
}
void insert(String name,String Address) {
repository.insert(name,Address);
}
void update(int id, String name, String address) {
repository.update(id,name,address);
}
void delete(int id) {
repository.delete(id);
}
public LiveData<ArrayList<HashMap<String, String>>> getAllNotes() {
return allNotesLivedata;
}
}
please dont suggest me to use room because it is not my requirement
The error just means that you are not submitting the compatible values :
In your code , when creating MutableLiveData , you have assigned it
ArrayList<HashMap<String,String>>
but when setting value to the MutableLiveData you are just passing a HashMap . So what you need to do is instead of passing HashMap directly ,you need to create an ArrayList and then to that arrayList you need to pass your HashMap and then set the ArrayList to the MutableLiveData .
You can do it somewhat like this .Below code is for illustration purpose
//Create an arrayList
ArrayList<HashMap> listofMaps = new ArrayList();
//then add all your hashmaps to your list
listofMaps.add(map);
//and then set it to the MutableLiveData
wordList.postValue(listOfMaps);
Or instead of the above process , the second way to solve this issue is , you just need to create the MutableLiveData of the Type : HashMap<String,String>
wordList = new MutableLiveData<HashMap<String,String>>();

Add Multiple table in one databasehelper class

I have 2 table Employee and order table, I'm trying to implement those tables into the same databasehelper class, but is gives me several errors, should i create a another databasehelper class, or can i implement these to into one
tables are looks like this
`public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "shopinstyle.db";
private static final String DB_TABLE = "Employee";
private static final String ORDER_TABLE = "Order";
//Employee
//columns
private static final String ID = "ID";
private static final String FNAME = "FNAME";
private static final String LNAME = "LNAME";
private static final String PNUMBER = "PNUMBER";
private static final String EMAIL = "EMAIL";
private static final String NIC = "NIC";
//Order
//columns
private static final String ord_ID = "ord_ID";
private static final String ord_Name = "ord_Name";
private static final String ord_Qty = "ord_Qty";
private static final String ord_Price = "ord_Price";
private static final String ord_Location = "ord_Location";
private static final String CREATE_TABLE = "CREATE TABLE " + DB_TABLE + " (" +
ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
FNAME + " TEXT, " +
LNAME + " TEXT, " +
PNUMBER + " TEXT, " +
EMAIL + " TEXT, " +
NIC + " TEXT" + ")";
private static final String CREATE_TABLE_ORDER = "CREATE TABLE " + ORDER_TABLE + " (" +
ord_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
ord_Name + " TEXT, " +
ord_Qty + " TEXT, " +
ord_Price + " TEXT, " +
ord_Location + " TEXT " + ")";
public DatabaseHelper(Context context) {
super(context, DB_NAME,ORDER_TABLE, null, 1);
}
#Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_TABLE);
sqLiteDatabase.execSQL(CREATE_TABLE_ORDER);
}
#Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + DB_TABLE);
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + ORDER_TABLE);
onCreate(sqLiteDatabase);
}`
there is a error in this line
public DatabaseHelper(Context context) {
super(context, DB_NAME,ORDER_TABLE, null, 1);
}
The 3d argument in the cal of super() inside the constructor of the DatabaseHelper class is factory which you can pass as null and not a table's name:
super(context, DB_NAME,null, 1);

application crashes after SQL request

My application crashes when I do a SQL request.
It says that the table doesn't exist and I don't know why.
Could you help me?
Here is the logcat:
03-27 15:35:49.718 5672-5672/descartes.info.l3ag2.eyetrek E/AndroidRuntime: FATAL EXCEPTION: main
Process: descartes.info.l3ag2.eyetrek,
PID: 5672 android.database.sqlite.SQLiteException: no such table: bddchampignons (code 1):,
while compiling: SELECT * FROM bddchampignons
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255)
at descartes.info.l3ag2.eyetrek.classes.DatabaseHandler.getAllChampignons(DatabaseHandler.java:578)
at descartes.info.l3ag2.eyetrek.fragment.mushroomanalysis.FragmentCirconstance1.lambda$onCreateView$2$FragmentCirconstance1(FragmentCirconstance1.java:147)
at descartes.info.l3ag2.eyetrek.fragment.mushroomanalysis.FragmentCirconstance1$$Lambda$2.onClick(Unknown Source)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
this is the request I am doing :
List<Mushroom> MushroomList = new ArrayList<Mushroom>();
MushroomList = databaseHandler.getAllChampignons();
String res= "";
Log.e("List", MushroomList.toString());
for (Mushroom mushroom: MushroomList) {
Log.e("NAME", mushroom.getName());
res = res + mushroom.getId() + "\n";
}
createAlertBox("Resultats", res);
and this is a part of the code from my DataBaseHandler class where is the method getAllChampignons:
private static final String TABLE_CHAMPIGNON = "bddchampignons";
//(my csv file is named "bddchampignons")
public List<Mushroom> getAllChampignons() {
List<Mushroom> champignonsList = new ArrayList<Mushroom>();
String selectQuery = "SELECT * FROM " + TABLE_CHAMPIGNON;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
Mushroom champ = new Mushroom();
champ.setId(Integer.parseInt(cursor.getString(0)));
champ.setName(cursor.getString(1));
champ.setDiametreMin(Integer.parseInt(cursor.getString(2)));
champ.setDiametreMax(Integer.parseInt(cursor.getString(3)));
champ.setCouleurChapeau(cursor.getString(4));
champ.setFormeChapeau(cursor.getString(5));
champ.setSurfaceChapeau(cursor.getString(6));
champ.setTypeMarge(cursor.getString(7));
champ.setCouleurMarge(cursor.getString(8));
champ.setDessousChapeau(cursor.getString(9));
champ.setCouleurDessousChapeau(cursor.getString(10));
champ.setOxydationChapeau(cursor.getString(11));
champ.setCouleurOxydationChapeau(cursor.getString(12));
champ.setInsertionDessousPied(cursor.getString(13));
champ.setEspaceLamelles(cursor.getString(14));
champ.setTypeLamelles(cursor.getString(15));
champ.setCouleurPied(cursor.getString(16));
champ.setPiedCreuxPlein(cursor.getString(17));
champ.setFormePied(cursor.getString(18));
champ.setLongueurPied(cursor.getString(19));
champ.setSurfacePied(cursor.getString(20));
champ.setPositionPiedChapeau(cursor.getString(21));
champ.setPresenceAnneau(cursor.getString(22));
champ.setOrientationAnneau(cursor.getString(23));
champ.setMobiliteAnneau(cursor.getString(24));
champ.setCouleurAnneau(cursor.getString(25));
champ.setPousseTouffe(cursor.getString(26));
champ.setCouleurBasePied(cursor.getString(27));
champ.setCouleurChair(cursor.getString(28));
champ.setOxydationChair(cursor.getString(29));
champ.setCouleurOxydationChair(cursor.getString(30));
champ.setFermeteChair(cursor.getString(31));
champ.setOdeur(cursor.getString(32));
champ.setLatex(cursor.getString(33));
champ.setCouleurLatex(cursor.getString(34));
champ.setMoisPousseTot(cursor.getString(35));
champ.setMoisPousseTard(cursor.getString(36));
champ.setMilieu(cursor.getString(37));
champ.setPousseBois(cursor.getString(38));
champ.setNomVernaculaire(cursor.getString(39));
champ.setComestibilite(cursor.getString(40));
champ.setCommentaires(cursor.getString(41));
champ.setSynonymes(cursor.getString(42));
champignonsList.add(champ);
} while (cursor.moveToNext());
}
return champignonsList;
}
this is my DataBaseHandler classe where I created my table, but it doesn't work ..
I'm just showing you the part where it's about champignons(mushrooms)
and you can find :
- method onCreate where the table champignons is created
- method to create an Mushroom Object
- method which return a list with the elements corresponding to the SQL request
- method which return a list with all the elements of the database
- method
public class DatabaseHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "db_eyetrek";
private static final String TABLE_CHAMPIGNON = "bddchampignons";
private static final String CHAMP_ID = "id";
private static final String CHAMP_NAME = "name";
private static final String CHAMP_DIAMETRE_MIN = "diametreMin";
private static final String CHAMP_DIAMETRE_MAX = "diametreMax";
private static final String COULEUR_CHAPEAU = "couleurChapeau";
private static final String FORME_CHAPEAU = "formeChapeau";
private static final String SURFACE_CHAPEAU = "surfaceChapeau";
private static final String TYPE_MARGE= "typeMarge";
private static final String COULEUR_MARGE = "couleurMarge";
private static final String DESSOUS_CHAPEAU = "dessousChapeau";
private static final String COULEUR_DESSOUS_CHAPEAU = "couleurDessousChapeau";
private static final String OXYDATION_CHAPEAU = "oxydationChapeau";
private static final String COULEUR_OXYDATION_CHAPEAU = "couleurOxydationChapeau";
private static final String INSERTION_DESSOUS_PIED= "insertionDessousPied";
private static final String ESPACE_LAMELLES = "espaceLamelles";
private static final String TYPE_LAMELLES = "typeLamelles";
private static final String COULEUR_PIED = "couleurPied";
private static final String PIED_CREUX_PLEIN = "piedCreuxPlein";
private static final String FORME_PIED = "formePied";
private static final String LONGEUR_PIED = "longueurPied";
private static final String SURFACE_PIED = "surfacePied";
private static final String POSITION_PIED_CHAPEAU = "positionPiedChapeau";
private static final String PRESENCE_ANNEAU = "presenceAnneau";
private static final String ORIENTATION_ANNEAU = "orientationAnneau";
private static final String MOBILITE_ANNEAU = "mobiliteAnneau";
private static final String COULEUR_ANNEAU = "couleurAnneau";
private static final String POUSSE_TOUFFE = "pousseTouffe";
private static final String COULEUR_BASE_PIED = "couleurBasePied";
private static final String COULEUR_CHAIR = "couleurChair";
private static final String OXYDATION_CHAIR = "oxydationChair";
private static final String COULEUR_OXYDATION_CHAIR = "couleurOxydationChair";
private static final String FERMETE_CHAIR = "fermeteChair";
private static final String ODEUR = "odeur";
private static final String LATEX = "latex";
private static final String COULEUR_LATEX = "couleurLatex";
private static final String MOIS_POUSSE_TOT = "moisPousseTot";
private static final String MOIS_POUSSE_TARD = "moisPousseTard";
private static final String MILIEU = "milieu";
private static final String POUSSE_BOIS = "pousseBois";
private static final String NOM_VERNACULAIRE = "nomVernaculaire";
private static final String COMESTIBILITE = "comestibilite";
private static final String COMMENTAIRES = "commentaires";
private static final String SYNONYMES = "synonymes";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
getReadableDatabase();
}
#Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//Création de la table champignon
String CREATE_CHAMPIGNON_TABLE = "create table if not exists " + TABLE_CHAMPIGNON + " ("
+ CHAMP_ID + " INTEGER PRIMARY KEY AUTOINCREMENT ," + CHAMP_NAME + " VARCHAR (40),"
+ CHAMP_DIAMETRE_MIN + " INTEGER (2)," + CHAMP_DIAMETRE_MAX + " VARCHAR(3) ," + COULEUR_CHAPEAU + " VARCHAR (30)," + FORME_CHAPEAU + " VARCHAR (70),"
+ SURFACE_CHAPEAU + " VARCHAR (105)," + TYPE_MARGE + " VARCHAR (101)," + COULEUR_MARGE + " VARCHAR (11)," + DESSOUS_CHAPEAU + " VARCHAR (26),"
+ COULEUR_DESSOUS_CHAPEAU + " VARCHAR (29)," + OXYDATION_CHAPEAU + " VARCHAR(20)," + COULEUR_OXYDATION_CHAPEAU + " VARCHAR(14)," + INSERTION_DESSOUS_PIED + " VARCHAR (46),"
+ ESPACE_LAMELLES + " VARCHAR (8)," + TYPE_LAMELLES + " VARCHAR (34)," + COULEUR_PIED + " VARCHAR (22)," + PIED_CREUX_PLEIN + " VARCHAR (21),"
+ FORME_PIED + " VARCHAR (165)," + LONGEUR_PIED + " VARCHAR (10)," + SURFACE_PIED + " VARCHAR (84)," + POSITION_PIED_CHAPEAU + " VARCHAR (9),"
+ PRESENCE_ANNEAU + " VARCHAR (3)," + ORIENTATION_ANNEAU + " VARCHAR (10)," + MOBILITE_ANNEAU + " VARCHAR (6)," + COULEUR_ANNEAU + " VARCHAR (43),"
+ POUSSE_TOUFFE + " VARCHAR (3),"+ COULEUR_BASE_PIED + " VARCHAR (21)," + COULEUR_CHAIR + " VARCHAR (30)," + OXYDATION_CHAIR + " VARCHAR (3),"
+ COULEUR_OXYDATION_CHAIR + " VARCHAR (21)," + FERMETE_CHAIR + " VARCHAR (16)," + ODEUR + " VARCHAR (25)," + LATEX + " VARCHAR (3)," + COULEUR_LATEX + " VARCHAR (14),"
+ MOIS_POUSSE_TOT + " VARCHAR (19)," + MOIS_POUSSE_TARD + " VARCHAR (20)," + MILIEU + " VARCHAR (49)," + POUSSE_BOIS + " VARCHAR (3)," + NOM_VERNACULAIRE + " VARCHAR (87),"
+ COMESTIBILITE + " VARCHAR (18)," + COMMENTAIRES + " VARCHAR (332)," + SYNONYMES + " VARCHAR (34) )";
sqLiteDatabase.execSQL(CREATE_CHAMPIGNON_TABLE);
}
#Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_DIDACTICIEL);
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_LEAFS);
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_ANIMAL);
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_CHAMPIGNON);
onCreate(sqLiteDatabase);
}
public void addChampignon (Mushroom champignon) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(CHAMP_NAME, champignon.getName());
values.put(CHAMP_DIAMETRE_MIN, champignon.getDiametreMin());
values.put(CHAMP_DIAMETRE_MAX, champignon.getDiametreMax());
values.put(COULEUR_CHAPEAU, champignon.getCouleurChapeau());
values.put(FORME_CHAPEAU, champignon.getFormeChapeau());
values.put(SURFACE_CHAPEAU, champignon.getSurfaceChapeau());
values.put(TYPE_MARGE, champignon.getTypeMarge());
values.put(COULEUR_MARGE, champignon.getCouleurMarge());
values.put(DESSOUS_CHAPEAU, champignon.getDessousChapeau());
values.put(COULEUR_DESSOUS_CHAPEAU,champignon.getCouleurDessousChapeau());
values.put(OXYDATION_CHAPEAU, champignon.getOxydationChapeau());
values.put(COULEUR_OXYDATION_CHAPEAU, champignon.getCouleurOxydationChapeau());
values.put(INSERTION_DESSOUS_PIED, champignon.getInsertionDessousPied());
values.put(ESPACE_LAMELLES, champignon.getEspaceLamelles());
values.put(TYPE_LAMELLES, champignon.getTypeLamelles());
values.put(COULEUR_PIED, champignon.getCouleurPied());
values.put(PIED_CREUX_PLEIN, champignon.getPiedCreuxPlein());
values.put(FORME_PIED, champignon.getFormePied());
values.put(LONGEUR_PIED, champignon.getLongueurPied());
values.put(SURFACE_PIED, champignon.getSurfacePied());
values.put(POSITION_PIED_CHAPEAU, champignon.getPositionPiedChapeau());
values.put(PRESENCE_ANNEAU, champignon.getPresenceAnneau());
values.put(ORIENTATION_ANNEAU, champignon.getOrientationAnneau());
values.put(MOBILITE_ANNEAU, champignon.getMobiliteAnneau());
values.put(COULEUR_ANNEAU, champignon.getCouleurAnneau());
values.put(POUSSE_TOUFFE, champignon.getPousseTouffe());
values.put(COULEUR_BASE_PIED, champignon.getCouleurBasePied());
values.put(COULEUR_CHAIR, champignon.getCouleurChair());
values.put(OXYDATION_CHAIR, champignon.getCouleurOxydationChair());
values.put(COULEUR_OXYDATION_CHAIR, champignon.getCouleurOxydationChair());
values.put(FERMETE_CHAIR, champignon.getFermeteChair());
values.put(ODEUR, champignon.getOdeur());
values.put(LATEX, champignon.getLatex());
values.put(COULEUR_LATEX, champignon.getCouleurLatex());
values.put(MOIS_POUSSE_TOT, champignon.getMoisPousseTot());
values.put(MOIS_POUSSE_TARD, champignon.getMoisPousseTard());
values.put(MILIEU, champignon.getMilieu());
values.put(POUSSE_BOIS, champignon.getPousseBois());
values.put(NOM_VERNACULAIRE, champignon.getNomVernaculaire());
values.put(COMESTIBILITE, champignon.getComestibilite());
values.put(COMMENTAIRES, champignon.getCommentaires());
values.put(SYNONYMES, champignon.getSynonymes());
db.insert(TABLE_CHAMPIGNON, null, values);
db.close();
}
/**
* Retourne une liste des champignons correspondant à la requête
*
* #param query
* #return
*/
public List<Mushroom> getChampignonFromRequest(String query) {
List<Mushroom> mushroomList = new ArrayList<Mushroom>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query, null);
if (cursor.moveToFirst()) {
do {
Mushroom champ = new Mushroom();
champ.setId(Integer.parseInt(cursor.getString(0)));
champ.setName(cursor.getString(1));
champ.setDiametreMin(Integer.parseInt(cursor.getString(2)));
champ.setDiametreMax(Integer.parseInt(cursor.getString(3)));
champ.setCouleurChapeau(cursor.getString(4));
champ.setFormeChapeau(cursor.getString(5));
champ.setSurfaceChapeau(cursor.getString(6));
champ.setTypeMarge(cursor.getString(7));
champ.setCouleurMarge(cursor.getString(8));
champ.setDessousChapeau(cursor.getString(9));
champ.setCouleurDessousChapeau(cursor.getString(10));
champ.setOxydationChapeau(cursor.getString(11));
champ.setCouleurOxydationChapeau(cursor.getString(12));
champ.setInsertionDessousPied(cursor.getString(13));
champ.setEspaceLamelles(cursor.getString(14));
champ.setTypeLamelles(cursor.getString(15));
champ.setCouleurPied(cursor.getString(16));
champ.setPiedCreuxPlein(cursor.getString(17));
champ.setFormePied(cursor.getString(18));
champ.setLongueurPied(cursor.getString(19));
champ.setSurfacePied(cursor.getString(20));
champ.setPositionPiedChapeau(cursor.getString(21));
champ.setPresenceAnneau(cursor.getString(22));
champ.setOrientationAnneau(cursor.getString(23));
champ.setMobiliteAnneau(cursor.getString(24));
champ.setCouleurAnneau(cursor.getString(25));
champ.setPousseTouffe(cursor.getString(26));
champ.setCouleurBasePied(cursor.getString(27));
champ.setCouleurChair(cursor.getString(28));
champ.setOxydationChair(cursor.getString(29));
champ.setCouleurOxydationChair(cursor.getString(30));
champ.setFermeteChair(cursor.getString(31));
champ.setOdeur(cursor.getString(32));
champ.setLatex(cursor.getString(33));
champ.setCouleurLatex(cursor.getString(34));
champ.setMoisPousseTot(cursor.getString(35));
champ.setMoisPousseTard(cursor.getString(36));
champ.setMilieu(cursor.getString(37));
champ.setPousseBois(cursor.getString(38));
champ.setNomVernaculaire(cursor.getString(39));
champ.setComestibilite(cursor.getString(40));
champ.setCommentaires(cursor.getString(41));
champ.setSynonymes(cursor.getString(42));
mushroomList.add(champ);
} while (cursor.moveToNext());
}
cursor.close();
return mushroomList;
}
/**
* Ajout des Champignons depuis& un CSV
*
* #param inputStream
* #param context
*/
public void addChampignonFromCsv(InputStream inputStream, Context context) {
DatabaseHandler db = new DatabaseHandler(context);
Scanner scanner = new Scanner(inputStream);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String str[] = line.split(";");
db.addChampignon(new Mushroom(Integer.parseInt(str[0]), str[1], Integer.parseInt(str[2]), Integer.parseInt(str[3]),str[4],str[5],
str[6],str[7],str[8],str[9],str[10],str[11],str[12],str[13],str[14],str[15],
str[16],str[17],str[18],str[19],str[20],str[21],str[22],str[23],str[24],str[25],
str[26],str[27],str[28],str[29],str[30],str[31],str[32],str[33],str[34],str[35],
str[36],str[37],str[38],str[39],str[40],str[41],str[42]));
}
scanner.close();
}
/**
* Retourne tous les champignons de la base de données
*
* #return
*/
public List<Mushroom> getAllChampignons() {
List<Mushroom> champignonsList = new ArrayList<Mushroom>();
String selectQuery = "SELECT * FROM " + TABLE_CHAMPIGNON;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
Mushroom champ = new Mushroom();
champ.setId(Integer.parseInt(cursor.getString(0)));
champ.setName(cursor.getString(1));
champ.setDiametreMin(Integer.parseInt(cursor.getString(2)));
champ.setDiametreMax(Integer.parseInt(cursor.getString(3)));
champ.setCouleurChapeau(cursor.getString(4));
champ.setFormeChapeau(cursor.getString(5));
champ.setSurfaceChapeau(cursor.getString(6));
champ.setTypeMarge(cursor.getString(7));
champ.setCouleurMarge(cursor.getString(8));
champ.setDessousChapeau(cursor.getString(9));
champ.setCouleurDessousChapeau(cursor.getString(10));
champ.setOxydationChapeau(cursor.getString(11));
champ.setCouleurOxydationChapeau(cursor.getString(12));
champ.setInsertionDessousPied(cursor.getString(13));
champ.setEspaceLamelles(cursor.getString(14));
champ.setTypeLamelles(cursor.getString(15));
champ.setCouleurPied(cursor.getString(16));
champ.setPiedCreuxPlein(cursor.getString(17));
champ.setFormePied(cursor.getString(18));
champ.setLongueurPied(cursor.getString(19));
champ.setSurfacePied(cursor.getString(20));
champ.setPositionPiedChapeau(cursor.getString(21));
champ.setPresenceAnneau(cursor.getString(22));
champ.setOrientationAnneau(cursor.getString(23));
champ.setMobiliteAnneau(cursor.getString(24));
champ.setCouleurAnneau(cursor.getString(25));
champ.setPousseTouffe(cursor.getString(26));
champ.setCouleurBasePied(cursor.getString(27));
champ.setCouleurChair(cursor.getString(28));
champ.setOxydationChair(cursor.getString(29));
champ.setCouleurOxydationChair(cursor.getString(30));
champ.setFermeteChair(cursor.getString(31));
champ.setOdeur(cursor.getString(32));
champ.setLatex(cursor.getString(33));
champ.setCouleurLatex(cursor.getString(34));
champ.setMoisPousseTot(cursor.getString(35));
champ.setMoisPousseTard(cursor.getString(36));
champ.setMilieu(cursor.getString(37));
champ.setPousseBois(cursor.getString(38));
champ.setNomVernaculaire(cursor.getString(39));
champ.setComestibilite(cursor.getString(40));
champ.setCommentaires(cursor.getString(41));
champ.setSynonymes(cursor.getString(42));
champignonsList.add(champ);
} while (cursor.moveToNext());
}
return champignonsList;
}

memory exhausted when trying to get data from database (android)

I'm trying to get some information from my database. I'm a beginner in android.
I have a database's create class, called "Database", and a database access class, called "Database_Acesso". They look like that:
Database.java:
package workshopee.ct.ufrn.br.ssmonitor;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class Database extends SQLiteOpenHelper{
private static final int versao_db = 1;
private static final String nome_db = "ssmonitor_db";
private static final String table1 = "phone";
private static final String id = "_id";
private static final String longitude = "longitude";
private static final String latitude = "latitude";
private static final String forca_torres = "qtdtorres";
private static final String forca_dbm = "dbm";
private static final String mcc = "mcc";
private static final String mnc = "mnc";
private static final String phone_type = "phone_type";
private static final String operadora = "operadora";
private static final String network_type = "networkType";
private static final String cid = "cid";
private static final String lac = "lac";
public Database(Context context) {
super(context, nome_db, null, versao_db);
}
#Override
public void onCreate(SQLiteDatabase db) {
String criarTabela = "CREATE TABLE " + table1 + "("
+ id + " INTEGER PRIMARY KEY AUTOINCREMENT," + longitude + " REAL,"
+ latitude + " REAL," + forca_torres + " INTEGER," + forca_dbm + " REAL," + mcc + " INTEGER,"
+ mnc + " INTEGER," + phone_type + " TEXT," + operadora + " TEXT," + network_type + " INTEGER," + cid + " INTEGER,"
+ lac + " INTEGER )";
db.execSQL(criarTabela);
}
#Override
public void onUpgrade(SQLiteDatabase db, int versao_ant, int versao_nv) {
Log.w(Database.class.getName(),
"Atualizando o banco de dados da versão " + versao_ant + " para "
+ versao_nv + ", isso apagará os dados antigos.");
db.execSQL("DROP TABLE IF EXISTS " + table1 + ";");
onCreate(db);
}
public void clear (SQLiteDatabase db) {
Log.w(Database.class.getName(),
"Apagando informações salvas anteriormente.");
db.execSQL("DROP TABLE IF EXISTS " + table1 + ";");
onCreate(db);
}
}
Database_Acesso.java:
package workshopee.ct.ufrn.br.ssmonitor;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;
public class Database_Acesso {
private SQLiteDatabase db;
public Database_Acesso(Context context) {
Database aux_db = new Database(context);
db = aux_db.getWritableDatabase();
}
public void inserir_phone (Phone ph) {
ContentValues valores = new ContentValues();
valores.put("longitude",ph.getLongitude());
valores.put("latitude", ph.getLatitude());
valores.put("qtdtorres", ph.getTorres());
valores.put("dbm", ph.getDbm());
valores.put("mcc", ph.getMcc());
valores.put("mnc", ph.getMnc());
valores.put("phone_type", ph.getPhoneType());
valores.put("operadora", ph.getOperadora());
valores.put("cid",ph.getCid());
valores.put("lac",ph.getLac());
db.insert("phone", null, valores);
}
public List<Phone> buscar_phone () {
List<Phone> lista = new ArrayList<Phone>();
String[] colunas = new String[]{"_id", "longitude", "latitude", "qtdtorres", "dbm",
"mcc", "mnc", "phone_type", "operadora", "networkType", "cid", "lac"};
Cursor cursor = db.query("phone", colunas, null, null, null, null,"_id ASC");
if (cursor.getCount() > 0) {
cursor.moveToFirst();
}
do {
Phone p = new Phone();
p.setId(cursor.getLong(0));
p.setLongitude(cursor.getDouble(1));
p.setLatitude(cursor.getDouble(2));
p.setTorres(cursor.getInt(3));
p.setDbm(cursor.getInt(4));
p.setMcc(cursor.getInt(5));
p.setMnc(cursor.getInt(6));
p.setPhoneType(cursor.getString(7));
p.setOperadora(cursor.getString(8));
p.setNetWorkType(cursor.getString(9));
p.setCid(cursor.getInt(10));
p.setLac(cursor.getInt(11));
lista.add(p);
} while (!cursor.isLast());
return lista;
}
}
Here is the part of my MainActivity that inserts data:
database_acesso.inserir_phone(cell);
Where database_acesso is an instance of Database_acesso and cell is an instance of Phone.
And here is how I'm trying to get information:
TextView list_text_view = (TextView) rootView.findViewById(R.id.list_text_view);
List list = main.database_acesso.buscar_phone();
list_text_view.append(" - " + list.size());
I'm using fragments, so "main" is a instance on MainActivity.
When I try to execute it, I get the following error:
java.lang.OutOfMemoryError: [memory exhausted]
at dalvik.system.NativeStart.main(Native Method)
It is the full stack trace.
Any ideia for solving that?
Thx.
You never call cursor.moveToNext() in your do { ... } while () loop, so you create new Phone objects continuously until you run out of memory.
An arguably better way of writing the loop would instead be:
Cursor cursor = db.query("phone", colunas, null, null, null, null,"_id ASC");
while (cursor.moveToNext())
{
// Do stuff
}
...since moveToNext() returns a boolean indicating if it has reached the end. It also saves the overhead of the call to getCount().

Android: SQLiteDatabase column doesn't exist error

I've encountered an error with creating and loading my database for my program. I get an error of "no such column: responsible: , while compiling:
SELECT id, name, responsible, priority
FROM tasks "
Can someone point out what I've done wrong. Thanks
public class TasksSQLiteOpenHelper extends SQLiteOpenHelper {
public static final int VERSION = 1;
public static final String DB_NAME = "tasks_db.sqlite";
public static final String TASKS_TABLE = "tasks";
public static final String TASK_ID = "id";
public static final String TASK_NAME = "name";
public static final String TASK_COMPLETE = "complete";
public static final String TASK_RESPONSIBLE = "responsible";
public static final String TASK_PRIORITY = "priority";
public TasksSQLiteOpenHelper(Context context) {
super(context, DB_NAME, null, VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
dropAndCreate(db);
}
protected void dropAndCreate(SQLiteDatabase db) {
db.execSQL("drop table if exists " + TASKS_TABLE + ";");
createTables(db);
}
protected void createTables(SQLiteDatabase db) {
db.execSQL(
"create table " + TASKS_TABLE +" (" +
TASK_ID + " integer primary key autoincrement not null," +
TASK_NAME + " text," +
TASK_COMPLETE + " text," +
TASK_RESPONSIBLE + " text" +
TASK_PRIORITY + " integer" +
");"
);
}
}
-
public class TaskManagerApplication extends Application {
private SQLiteDatabase database;
private ArrayList<Task> currentTasks;
#Override
public void onCreate() {
super.onCreate();
TasksSQLiteOpenHelper helper = new TasksSQLiteOpenHelper(this);
database = helper.getWritableDatabase();
if (null == currentTasks) {
loadTasks();
}
}
private void loadTasks() {
currentTasks = new ArrayList<Task>();
Cursor tasksCursor = database.query(TASKS_TABLE, new String[] {
TASK_ID,
TASK_NAME,
TASK_RESPONSIBLE,
TASK_PRIORITY,
TASK_COMPLETE}, null, null, null, null, String.format("%s,%s", TASK_COMPLETE, TASK_NAME));
tasksCursor.moveToFirst();
Task t;
if (! tasksCursor.isAfterLast()) {
do {
int id = tasksCursor.getInt(0);
String name = tasksCursor.getString(1);
String priority = tasksCursor.getString(2);
String responsible = tasksCursor.getString(3);
String boolValue = tasksCursor.getString(4);
boolean complete = Boolean.parseBoolean(boolValue);
t = new Task(name, priority, responsible);
t.setId(id);
t.setComplete(complete);
currentTasks.add(t);
} while (tasksCursor.moveToNext());
}
tasksCursor.close();
}
}
You have a typo in your CREATE TABLE;
db.execSQL(
"create table " + TASKS_TABLE +" (" +
TASK_ID + " integer primary key autoincrement not null," +
TASK_NAME + " text," +
TASK_COMPLETE + " text," +
TASK_RESPONSIBLE + " text" + // <--- missing a comma
TASK_PRIORITY + " integer" +
");"
);
You have a minor typing error in your code. Corrected version :
db.execSQL(
"create table " + TASKS_TABLE +" (" +
TASK_ID + " integer primary key autoincrement not null," +
TASK_NAME + " text," +
TASK_COMPLETE + " text," +
TASK_RESPONSIBLE + " text," +
TASK_PRIORITY + " integer" +
");"
);

Categories