android - Reading from SQLite database causes stack overflow -
can't find problem why sqlite database cannot read, it's taken me long , still can't figure out why trying read giving me stack overflow, appreciate help, thank you.
public class databasehandler extends sqliteopenhelper { private static context ctx; // static variables // database version private static final int database_version = 1; // database name private static final string database_name = "chirhogs_android_api"; // login table name private static final string table_login = "fusers"; // login table columns names private static final string key_id = "id"; public static final string key_name = "name"; public static final string key_email = "email"; private static final string key_uid = "uid"; private static final string key_created_at = "created_at"; public databasehandler(context ctx) { super(ctx, database_name, null, database_version); this.ctx = ctx; } databasehandler jhelper = new databasehandler(ctx.getapplicationcontext()); // creating tables @override public void oncreate(sqlitedatabase db) { string create_login_table = "create table " + table_login + "(" + key_id + " integer primary key," + key_name + " text," + key_email + " text unique," + key_uid + " text," + key_created_at + " text " + ");"; db.execsql(create_login_table); } // upgrading database @override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { // drop older table if existed db.execsql("drop table if exists " + table_login); // create tables again oncreate(db); } /** * storing user details in database * */ public void adduser(string name, string email, string uid, string created_at) { sqlitedatabase db = jhelper.getwritabledatabase(); contentvalues values = new contentvalues(); values.put(key_name, name); // name values.put(key_email, email); // email values.put(key_uid, uid); // email values.put(key_created_at, created_at); // created @ // inserting row db.insert(table_login, null, values); // closing database connection } /** * getting user data database * */ public hashmap<string, string> getuserdetails(){ hashmap<string,string> user = new hashmap<string,string>(); string selectquery = "select * " + table_login + " order "+key_created_at+" desc limit 1"; sqlitedatabase db = jhelper.getreadabledatabase(); cursor cursor = db.rawquery(selectquery, null); // move first row cursor.movetofirst(); if(cursor.getcount() > 0){ user.put("name", cursor.getstring(1)); user.put("email", cursor.getstring(2)); user.put("uid", cursor.getstring(3)); user.put("created_at", cursor.getstring(4)); } cursor.close(); db.close(); // return user return user; } /** * getting user login.xml status * return true if rows there in table * */ public int getrowcount() { string countquery = "select * " + table_login; sqlitedatabase db = jhelper.getreadabledatabase(); cursor cursor = db.rawquery(countquery, null); int rowcount = cursor.getcount(); cursor.close(); // return row count return rowcount; }
when run gives me stack on flow , closes application, have checked sqlite database , data written correctly, it's reading issue.
here log:
05-29 15:15:59.827 3191-3191/? e/androidruntime﹕ fatal exception: main process: abelabs.dank, pid: 3191 java.lang.stackoverflowerror: stack size 8mb @ android.database.sqlite.sqliteopenhelper.<init>(sqliteopenhelper.java:77) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:35) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.dank.library.databasehandler.<init>(databasehandler.java:38) @ abelabs.
it's because of line:
databasehandler jhelper = new databasehandler(ctx.getapplicationcontext());
every time create new instance of databasehandler class, in turn creates new instance, creates new instance , on. rid of line , replace jhelper
references this
.
edit
generally, when use databasehelper, implement making databasehandler singleton.
private static databasehelper sdatabasehelperinstance = null; public static databasehelper getinstance(context context) { if (sdatabasehelperinstance == null) { sdatabasehelperinstance = new databasehelper(context); } return sdatabasehelperinstance; }
and time need instance of sqlitedatabase, follows:
sqlitedatabase db = databasehelper.getinstance(some context object).getreadabledatabase();
and methods such getrowcount()
, getuserdetails()
, you'll have provide them context parameter.
Comments
Post a Comment