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>>();
Related
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.
I Have Total 5 Table in SQLite database So if i create a all table in DatabaseHalper.class and perform all CRUD((Create, Read, Update and Delete)) Operation in this class then this is look like a Big Data
Table Is Like: Company, Contact, ToDo. etc
So 1st I Want to create a multiple table in DatabaseHalper.class
2nd Create a another class Like using Table Name ComapnyDB.class
In this Class i want to Perform CRUD operation for a Company Table also All query perform for Company table
3rd same for Contact table. Create table in DatabaseHalper.class
and create a new class like Contact.class in this class perform all CURD operation and perform other operation
So this way my code was Divided in different different class
For Example Below class is my DatabseHalper.class and in this class i'll create a Database Tables.
DatabaseHalper.class
public class DatabaseHelper extends SQLiteOpenHelper {
// Logcat tag
private static final String LOG = "DatabaseHelper";
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "contactsManager";
//Tables Name
private static final String COMPANY = "company";
private static final String CONTACTS = "contacts";
private static final String EVENT = "event";
private static final String TODO = "todo";
private static final String USER = "user";
// Common column names
private static final String KEY_ID = "id";
//Companies Table Column Name
private static final String KEY_COMPANY_ID = "CompanyId";
private static final String KEY_COMPANY_REFERENCE_ID = "ReferenceId";
private static final String KEY_COMPANY_NAME = "CompanyName";
private static final String KEY_COMPANY_WEBSITE = "CompanyWebsite";
private static final String KEY_COMPANY_EMAIL = "CompanyEmail";
private static final String KEY_COMPANY_PHONE_HOME = "CompanyPhoneHome";
private static final String KEY_COMPANY_PHONE_PRIMARY = "CompanyPhonePrimary";
private static final String KEY_COMPANY_ADDRESS1 = "CompanyAddress";
private static final String KEY_COMPANY_ADDRESS2 = "CompanyAddressSecondary";
private static final String KEY_COMPANY_CITY = "CompanyCity";
private static final String KEY_COMPANY_STATE = "CompanyState";
private static final String KEY_COMPANY_ZIP = "CompanyZip";
private static final String KEY_COMPANY_COUNTRY = "CompanyCountry";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// Table Create Statements
// Todo table create statement
private static final String CREATE_TABLE_COMPANY = "CREATE TABLE "
+ COMPANY + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_COMPANY_ID + " INTEGER,"
+ KEY_COMPANY_REFERENCE_ID + " INTEGER,"
+ KEY_COMPANY_NAME + " VARCHAR,"
+ KEY_COMPANY_WEBSITE + "VARCHAR,"
+ KEY_COMPANY_EMAIL + "VARCHAR,"
+ KEY_COMPANY_PHONE_HOME + "VARCHAR,"
+ KEY_COMPANY_PHONE_PRIMARY + "VARCHAR,"
+ KEY_COMPANY_ADDRESS1 + "VARCHAR,"
+ KEY_COMPANY_ADDRESS2 + "VARCHAR,"
+ KEY_COMPANY_CITY + "VARCHAR,"
+ KEY_COMPANY_STATE + "VARCHAR,"
+ KEY_COMPANY_ZIP + "INTEGER,"
+ KEY_COMPANY_COUNTRY + "VARCHAR" + ")";
#Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_COMPANY);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + COMPANY);
}
}
Now I'll Create CompanyDB.class For a CURD Operation But How to i access DatabaseHelper.class In Company.class.
Thanks In Advance :)
The following is an example of splitting tables away from the DatabaseHelper :-
ContactDB.java
public class ContactDB {
public static final String TBNAME = "contact";
public static final String COL_ID = BaseColumns._ID;
public static final String COL_NAME = "contact_name";
public static final String COL_EMAIL = "contact_email";
public static String getTableCreatSQL() {
return "CREATE TABLE IF NOT EXISTS " + TBNAME + "(" +
COL_ID + " INTEGER PRIMARY KEY, " +
COL_NAME + " TEXT," +
COL_EMAIL + " TEXT" +
")";
}
public static long addContact(SQLiteDatabase db, String contact_name, String contact_email) {
ContentValues cv = new ContentValues();
cv.put(COL_NAME,contact_name);
cv.put(COL_EMAIL,contact_email);
return db.insert(TBNAME,null,cv);
}
public static Cursor getAllContacts(SQLiteDatabase db) {
return db.query(TBNAME,null,null,null,null,null,COL_NAME + " ASC," + COL_EMAIL + " ASC");
}
}
CompanyDB.java
public class CompanyDB {
public static final String TBNAME = "company";
public static final String COL_ID = BaseColumns._ID;
public static final String COL_NAME = "company_name";
public static String getTableCreateSQL() {
return "CREATE TABLE IF NOT EXISTS " + TBNAME + "(" +
COL_ID + " INTEGER PRIMARY KEY," +
COL_NAME + " TEXT" +
")";
}
public static long addCompany(SQLiteDatabase db, String company_name ) {
ContentValues cv = new ContentValues();
cv.put(COL_NAME,company_name);
return db.insert(TBNAME,null,cv);
}
public static Cursor getAllCompanies(SQLiteDatabase db) {
return db.query(TBNAME,null,null,null,null,null,COL_NAME + " ASC");
}
}
DBHelper.java (Database helper)
public class DBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydatabase";
public static final int DBVERSION = 1;
private static SQLiteDatabase mDB;
public DBHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
mDB = this.getWritableDatabase();
}
#Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CompanyDB.getTableCreateSQL());
db.execSQL(ContactDB.getTableCreatSQL());
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
Cursor mAllContacts;
Cursor mAllCompanies;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SQLiteDatabase mDB = new DBHelper(this).getWritableDatabase();
CompanyDB.addCompany(mDB,"mycompany");
ContactDB.addContact(mDB,"Fred","Fred#email.com");
ContactDB.addContact(mDB,"Bert","bertbloggins#bloggings.moc");
mAllCompanies = CompanyDB.getAllCompanies(mDB);
while (mAllCompanies.moveToNext()) {
Log.d("COMPANY",
"Company Name = " +
mAllCompanies.getString(
mAllCompanies.getColumnIndex(
CompanyDB.COL_NAME
)
)
);
}
Cursor mAllContacts = ContactDB.getAllContacts(mDB);
while (mAllContacts.moveToNext()) {
Log.d("CONTACT",
"Contact Name = " +
mAllContacts.getString(
mAllContacts.getColumnIndex(
ContactDB.COL_NAME
)
) +
" Email = " +
mAllContacts.getString(
mAllContacts.getColumnIndex(
ContactDB.COL_EMAIL
)
)
);
}
}
#Override
protected void onDestroy() {
super.onDestroy();
mAllCompanies.close();
mAllContacts.close();
}
}
This will add a company and 2 contacts (each time that it is run), retrieve the companies and contacts from the database and write the details to the log.
Output would be lime (first run) :-
04-02 09:09:42.556 1497-1497/so49607475_splittableclasses.so49607475_splittableclasses D/COMPANY: Company Name = mycompany
04-02 09:09:42.556 1497-1497/so49607475_splittableclasses.so49607475_splittableclasses D/CONTACT: Contact Name = Bert Email = bertbloggins#bloggings.moc
Contact Name = Fred Email = Fred#email.com
Hello I was working with SQlite on my phone with android studio
I have a simple database like this :
DATABASE 1 :
public class myDbAdapter {
myDbHelper myhelper;
public myDbAdapter(Context context) {
myhelper = new myDbHelper(context);
}
public long insertData(String name, String ip, String port, String rele) {
SQLiteDatabase dbb = myhelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(myDbHelper.NAME, name);
/* ... same for more items ...*/
long id = dbb.insert(TABLE_NAME, null, contentValues);
return id;
}
public String getData() {
SQLiteDatabase db = myhelper.getWritableDatabase();
String[] columns = {myDbHelper.UID, myDbHelper.NAME, myDbHelper.IP, myDbHelper.PORT, myDbHelper.RELE, myDbHelper.Hash};
Cursor cursor = db.query(TABLE_NAME, columns, null, null, null, null, null);
StringBuffer buffer = new StringBuffer();
int i = 0;
while (cursor.moveToNext()) {
i++;
int cid = cursor.getInt(cursor.getColumnIndex(myDbHelper.UID));
String name = cursor.getString(cursor.getColumnIndex(myDbHelper.NAME));
String ipE = cursor.getString(cursor.getColumnIndex(myDbHelper.IPE));
/* ... same for more items ...*/
buffer.append("*" + cid + "-" + name + "-" + ipE + "-" + port + "-" + rele + "\n");
}
List1.colu = i;
return buffer.toString();
}
public int delete(String uid) {
SQLiteDatabase db = myhelper.getWritableDatabase();
String delgrp = "DELETE FROM " + TABLE_NAME + " WHERE _id='" + uid + "'";
db.execSQL(delgrp);
return 1;
}
static class myDbHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "myDatabase"; // Database Name
public static final String TABLE_NAME = "Data"; // Table Name
private static final int DATABASE_Version = 1; // Database Version
private static final String UID = "_id"; // Column I (Primary Key)
/* ... same for more items ...*/
private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME +
" (" + UID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " VARCHAR(255) ," + IPE + " VARCHAR(255) ," + TEST1 + " VARCHAR(255) ," + TEST2 + " VARCHAR(255) ," + Hash + " VARCHAR(225));";
private static final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME;
private Context context;
public myDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_Version);
this.context = context;
}
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(CREATE_TABLE);
} catch (Exception e) {
// Message.message(context,""+e);
}
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
// Message.message(context,"OnUpgrade");
db.execSQL(DROP_TABLE);
onCreate(db);
} catch (Exception e) {
// Message.message(context,""+e);
}
}
}
I Wanted to add another TABLE to same database (MyDataBase)
So i created another java class named MyDbAdapter2
Same codes as above just changed class names and Table name
helper = new myDbAdapter(this);
helper2 = new myDbAdapter2(this);
DATABASE 2 :
public class myDbAdapter2 {
myDbHelper myhelper;
public myDbAdapter2(Context context) {
myhelper = new myDbHelper(context);
}
public long insertData(String name, String ip) {
/*...*/
}
public String getData() {
SQLiteDatabase db = myhelper.getWritableDatabase();
String[] columns = {myDbHelper.UID, myDbHelper.ITEM, myDbHelper.SUBITEM};
Cursor cursor = db.query(TABLE_NAME, columns, null, null, null, null, null);
StringBuffer buffer = new StringBuffer();
int i = 0;
while (cursor.moveToNext()) {
i++;
int cid = cursor.getInt(cursor.getColumnIndex(myDbHelper.UID));
String name = cursor.getString(cursor.getColumnIndex(myDbHelper.ITEM));
String ipe = cursor.getString(cursor.getColumnIndex(myDbHelper.SUBITEM));
buffer.append("*" + cid + "-" + name + "-" + ipe + "\n");
}
// List1.colu=i;
return buffer.toString();
}
static class myDbHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "myDatabase"; // Database Name
public static final String TABLE_NAME = "Data2"; // Table Name
private static final int DATABASE_Version = 1; // Database Version
private static final String UID = "_id"; // Column I (Primary Key)
/*...*/ //Column II
// ... // Column III
private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME +
" (" + UID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + ITEM + " VARCHAR(255) ," + SUBITEM + " VARCHAR(225));";
private static final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME;
private Context context;
public myDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_Version);
this.context = context;
}
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(CREATE_TABLE);
} catch (Exception e) {
// Message.message(context,""+e);
}
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
// Message.message(context,"OnUpgrade");
db.execSQL(DROP_TABLE);
onCreate(db);
}catch (Exception e) {
// Message.message(context,""+e);
}
}
}
}
When i try to access the other (Data2) database it cause a error !
android.database.sqlite.SQLiteException: no such table: Data2 (Sqlite code 1): , while compiling: SELECT _id, Item, SubItem FROM Data2, (OS error - 2:No such file or directory)
I Saw this on Log :
09-13 09:31:05.788 18454-18454/com.example.discopc.yubismart I/HwSecImmHelper: mSecurityInputMethodService is null
09-13 09:31:06.468 18454-18604/com.example.discopc.yubismart E/SQLiteLog: (1)
09-13 09:31:06.571 18454-18604/com.example.discopc.yubismart I/Process: Sending signal. PID: 18454 SIG: 9
Whats the problem ? First database works fine but second one not ,
Thanks.... ?
As you said - I Wanted to add another TABLE to same database (MyDataBase)
You should not use two different class for creating two different table in sqlite database. While executing one single of your adapter classes its creating one table and if your db version is same / different in adapter classes then one of two table would not be created / would be deleted.
Here db version is same that's why second table is not creating.
Create as many as your required tables inside onCreate() of your myDbHelper class and inside onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) execute drop table code for each table.
When you need another new table just create table as above and write code for drop table inside onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion).
You just need to remember for creating new tables or any structural change inside your sqlite database would be reflected only after changing the VERSION CODE of database.
You have created a database once with name MyDataBase having table Data.
You are again trying to create same MyDataBase with table Data2 that is causing the problem.
"I Want to create only 1 database , changing name to MyDataBase2 will work but why ?"
When you are changing name to MyDataBase2 it works as this one is a completely new database and you can create the Data2 table in it.
So if you want to create Data2 in your first version of database you have to create the table Data2 in it but not a completely new data base. If you want to know more about it please find it here.
I believe this answered your question.
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().
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" +
");"
);