Sqlite数据库Android游标/锁
我正在阅读我的表格,但我无法启动应用程序,因为它会给我这些错误: 下面是连接到dbclass的te代码。它调用DBclass中的id方法,然后关闭数据库Sqlite数据库Android游标/锁,android,database,sqlite,locking,cursor,Android,Database,Sqlite,Locking,Cursor,我正在阅读我的表格,但我无法启动应用程序,因为它会给我这些错误: 下面是连接到dbclass的te代码。它调用DBclass中的id方法,然后关闭数据库 public int return_id_phone(Context contxt) { Database db = new Database(contxt); db.open(); int id_phone = db.id(2); db.close(); return id_phone; } 下面是要
public int return_id_phone(Context contxt) {
Database db = new Database(contxt);
db.open();
int id_phone = db.id(2);
db.close();
return id_phone;
}
下面是要提取的代码。只返回一个数字它很简单,我不知道为什么它会崩溃。它在下面的错误中说,我没有关闭光标,数据库也被锁定
这是我的数据库类。昨天工作得很好,而今天却不行
包com.background
公共类数据库{
public static final String KEY_ROWID = "id";
public static final String KEY_NAME = "sync";
public static final String ID_ROW = "_ids";
public static final String VALUE_ROW = "_value";
public static final String ID = "id";
public static final String STATE = "state";
public static final String ID_CONTACTS = "idcontacts";
public static final String NAME = "name";
public static final String NUMBER = "phone";
private static final String DATABASE_NAME = "faraway";
private static final String DATABASE_TABLE = "sync";
private static final String DATABASE_TABLE_2 = "user";
private static final String DATABASE_TABLE_3 = "service";
private static final String DATABASE_TABLE_4 = "contacts";
private static final int DATABASE_VERSION = 1;
private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;
ArrayList<String> list = new ArrayList<String>();
String proba = "";
private static class DbHelper extends SQLiteOpenHelper {
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_NAME
+ " INTEGER NOT NULL);");
db.execSQL("CREATE TABLE " + DATABASE_TABLE_2 + " (" + ID_ROW
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + VALUE_ROW
+ " INTEGER NOT NULL);");
db.execSQL("CREATE TABLE " + DATABASE_TABLE_3 + " (" + ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + STATE
+ " INTEGER NOT NULL);");
db.execSQL("CREATE TABLE " + DATABASE_TABLE_4 + " (" + ID_CONTACTS
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME
+ " TEXT NOT NULL, " + NUMBER + " TEXT NOT NULL);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE);
onCreate(db);
}
}
public Database(Context c) {
ourContext = c;
}
public Database open() throws SQLException {
ourHelper = new DbHelper(ourContext);
ourDatabase = ourHelper.getWritableDatabase();
return this;
}
public void close() {
ourHelper.close();
}
public long primerCop() {
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, 1);
return ourDatabase.insert(DATABASE_TABLE, null, cv);
}
public long updateSync(int ids, int value) {
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, value);
return ourDatabase.update(DATABASE_TABLE, cv, KEY_ROWID + "=" + ids,
null);
}
public long zeroAll(int ids) {
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, 0);
return ourDatabase.update(DATABASE_TABLE, cv, KEY_ROWID + "=" + ids,
null);
}
public List<String> check() {
String[] columns = new String[] { KEY_ROWID, KEY_NAME };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_NAME + "=1",
null, null, null, null);
if (c != null) {
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
list.add(c.getString(0));
}
return list;
} else {
return null;
}
}
public long personaldata(Integer id) {
ContentValues cv = new ContentValues();
cv.put(VALUE_ROW, id);
return ourDatabase.insert(DATABASE_TABLE_2, null, cv);
}
public int id(int row) {
String[] columns = new String[] { ID_ROW, VALUE_ROW };
Cursor c = ourDatabase.query(DATABASE_TABLE_2, columns, ID_ROW + "='"
+ row+"'", null, null, null, null);
if (c != null) {
c.moveToFirst();
int id= c.getInt(1);
c.close();
return id;
} else {
return 0;
}
}
public long prepare_service() {
ContentValues cv = new ContentValues();
cv.put(STATE, 0);
return ourDatabase.insert(DATABASE_TABLE_3, null, cv);
}
public int chech_state(int id) {
String[] columns = new String[] { ID, STATE };
Cursor c = ourDatabase.query(DATABASE_TABLE_3, columns, ID + "=" + id,
null, null, null, null);
if (c != null) {
c.moveToFirst();
int a = c.getInt(1);
c.close();
return a;
} else {
return 2;
}
}
public long update_s(int value, int id) {
ContentValues cv = new ContentValues();
cv.put(STATE, value);
return ourDatabase.update(DATABASE_TABLE_3, cv, KEY_ROWID + "=" + id,
null);
}
public boolean Preferences(int id) {
String[] columns = new String[] { KEY_ROWID, KEY_NAME };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "="
+ id, null, null, null, null);
if (c != null) {
c.moveToFirst();
int number = c.getInt(1);
if (number == 1) {
c.close();
return true;
} else {
c.close();
return false;
}
} else {
c.close();
return false;
}
}
public long contact_table(String name, String number) {
ContentValues cv = new ContentValues();
cv.put(NAME, name);
cv.put(NUMBER, number);
return ourDatabase.insert(DATABASE_TABLE_4, null, cv);
}
public long update_name(String name, String number) {
ContentValues cv = new ContentValues();
cv.put(NAME, name);
return ourDatabase.update(DATABASE_TABLE_4, cv, NUMBER + "='" + number
+ "'", null);
}
public long update_phone(String name, String number) {
ContentValues cv = new ContentValues();
cv.put(NUMBER, number);
return ourDatabase.update(DATABASE_TABLE_4, cv, NAME + "='" + name
+ "'", null);
}
public JSONObject select_contact(String name, String number) {
String queryf = "select * from " + DATABASE_TABLE_4 + " where " + NAME
+ "='" + name + "' or " + NUMBER + "='" + number + "'";
Cursor c = ourDatabase.rawQuery(queryf, null);
JSONObject json = new JSONObject();
if (c.getCount() == 0) {
// No hay usuario y lo insertamos en la db
c.close();
try {
json.put("type", "upload");
json.put("name", name);
json.put("phone", number);
} catch (Exception ex) {
ex.printStackTrace();
}
return json;
} else {
c.close();
String queryf2 = "select * from " + DATABASE_TABLE_4 + " where "
+ NAME + "='" + name + "' and " + NUMBER + "='" + number
+ "'";
Cursor c2 = ourDatabase.rawQuery(queryf2, null);
if (c2.getCount() != 0) {
c2.close();
try {
json.put("type", "exists");
} catch (Exception ex) {
ex.printStackTrace();
}
return json;
} else {
c2.close();
String queryf3 = "select * from " + DATABASE_TABLE_4
+ " where " + NAME + "='" + name + "'";
Cursor c3 = ourDatabase.rawQuery(queryf3, null);
if (c3.getCount() != 0) {
c3.close();
try {
json.put("type", "change_phone");
} catch (Exception ex) {
ex.printStackTrace();
}
return json;
} else {
String queryf4 = "select * from " + DATABASE_TABLE_4
+ " where " + NUMBER + "='" + number + "'";
Cursor c4 = ourDatabase.rawQuery(queryf4, null);
if (c4.getCount() != 0) {
c4.close();
try {
json.put("type", "change_name");
} catch (JSONException e) {
e.printStackTrace();
}
return json;
}
}
}
return null;
}
}
公共静态最终字符串键\u ROWID=“id”;
公共静态最终字符串键\u NAME=“sync”;
公共静态最终字符串ID_ROW=“_ID”;
公共静态最终字符串值_行=“_值”;
公共静态最终字符串ID=“ID”;
公共静态最终字符串STATE=“STATE”;
公共静态最终字符串ID\u CONTACTS=“idcontacts”;
公共静态最终字符串NAME=“NAME”;
公共静态最终字符串NUMBER=“phone”;
私有静态最终字符串数据库\u NAME=“faraway”;
私有静态最终字符串数据库\u TABLE=“sync”;
私有静态最终字符串数据库\u TABLE\u 2=“user”;
私有静态最终字符串数据库\u TABLE\u 3=“服务”;
私有静态最终字符串数据库\u TABLE\u 4=“contacts”;
私有静态最终int数据库_VERSION=1;
私人助理;
私人最终语境;
私有SQLITE数据库;
ArrayList=新建ArrayList();
字符串proba=“”;
私有静态类DbHelper扩展了SQLiteOpenHelper{
公共DbHelper(上下文){
super(上下文、数据库名称、null、数据库版本);
}
@凌驾
public void onCreate(SQLiteDatabase db){
db.execSQL(“创建表”+数据库表+”(“+KEY\u ROWID
+“整数主键自动递增,”+键名称
+“整数不为空);”;
db.execSQL(“创建表”+数据库表2+”(“+ID\u行
+“整型主键自动递增,”+VALUE\u行
+“整数不为空);”;
db.execSQL(“创建表”+数据库表3+”(“+ID
+“整型主键自动递增,”+状态
+“整数不为空);”;
db.execSQL(“创建表”+数据库表4+(“+ID\u联系人
+“整型主键自动递增,”+名称
+“文本不为空,”+数字+“文本不为空”);”;
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
db.execSQL(“如果存在,则删除表”+数据库_表);
onCreate(db);
}
}
公共数据库(上下文c){
ourContext=c;
}
公共数据库open()引发SQLException{
ourHelper=newdbhelper(ourContext);
ourDatabase=ourHelper.getWritableDatabase();
归还这个;
}
公众假期结束(){
ourHelper.close();
}
公共长primerCop(){
ContentValues cv=新的ContentValues();
简历(姓名,1);
返回ourDatabase.insert(DATABASE_TABLE,null,cv);
}
公共长更新同步(int-id,int-value){
ContentValues cv=新的ContentValues();
cv.put(键名称、值);
返回ourDatabase.update(数据库表、cv、键ROWID+“=”+ids、,
无效);
}
公共长zeroAll(整数ID){
ContentValues cv=新的ContentValues();
cv.put(键名称,0);
返回ourDatabase.update(数据库表、cv、键ROWID+“=”+ids、,
无效);
}
公共列表检查(){
字符串[]列=新字符串[]{KEY\u ROWID,KEY\u NAME};
游标c=ourDatabase.query(数据库表、列、键名称+“=1”,
空,空,空,空);
如果(c!=null){
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
添加(c.getString(0));
}
退货清单;
}否则{
返回null;
}
}
公共长个人数据(整数id){
ContentValues cv=新的ContentValues();
cv.put(值_行,id);
返回ourDatabase.insert(DATABASE\u TABLE\u 2,null,cv);
}
公共整数id(整数行){
String[]columns=新字符串[]{ID\u ROW,VALUE\u ROW};
游标c=ourDatabase.query(数据库表2,列,ID行+“=”)
+行+“'”,空,空,空,空,空);
如果(c!=null){
c、 moveToFirst();
int id=c.getInt(1);
c、 close();
返回id;
}否则{
返回0;
}
}
公共长期服务{
ContentValues cv=新的ContentValues();
cv.put(状态,0);
返回ourDatabase.insert(DATABASE\u TABLE\u 3,null,cv);
}
公共内部检查状态(内部id){
字符串[]列=新字符串[]{ID,STATE};
游标c=ourDatabase.query(数据库表3,列,ID+“=”+ID,
空,空,空,空);
如果(c!=null){
c、 moveToFirst();
int a=c.getInt(1);
c、 close();
返回a;
}否则{
返回2;
}
}
公共长更新(int值,int id){
ContentValues cv=新的ContentValues();
cv.put(状态、值);
返回ourDatabase.update(数据库表3,cv,键ROWID+“=”+id,
无效);
}
公共布尔首选项(int-id){
字符串[]列=新字符串[]{KEY\u ROWID,KEY\u NAME};
游标c=ourDatabase.query(数据库表、列、键\u ROWID+“=”
+id,null,null,null,null);
如果(c!=null){
c、 moveToFirst();
整数=c.getInt(1);
如果(数字==1){
c、 close();
返回true;
}否则{
c、 close();
返回false;
}
}否则{
c、 close();
返回false;
}
}
公共长联系人_表(字符串名称、字符串编号){
ContentValues cv=新的ContentValues();
简历(姓名、姓名);
cv.put(数字、数字);
返回ourDatabase.insert(DATABASE\u TABLE\u 4,null,cv);
}
公共长更新名称(字符串名称、字符串编号){
ContentValues cv=新的ContentValues();
简历(姓名、姓名);
返回ourDatabase.update(数据库表4,cv,编号+“=”)+
> 07-09 11:54:05.460: E/SQLiteDatabase(6938): close() was never explicitly called on database '/data/data/com.anonyme.app/databases/faraway'
07-09 11:54:05.460: E/SQLiteDatabase(6938): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:2069)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1123)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1081)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1167)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:833)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at com.background.Database.open(Database.java:89)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at com.extract.Contacts.phoneandname(Contacts.java:124)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at com.anonyme.app.IntroActivity.uploadall(IntroActivity.java:85)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at com.anonyme.app.IntroActivity.onCreate(IntroActivity.java:76)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.app.Activity.performCreate(Activity.java:4465)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.app.ActivityThread.access$600(ActivityThread.java:127)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.os.Handler.dispatchMessage(Handler.java:99)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.os.Looper.loop(Looper.java:137)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at android.app.ActivityThread.main(ActivityThread.java:4507)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at java.lang.reflect.Method.invokeNative(Native Method)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at java.lang.reflect.Method.invoke(Method.java:511)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
07-09 11:54:05.460: E/SQLiteDatabase(6938): at dalvik.system.NativeStart.main(Native Method)
07-09 11:54:05.460: E/System(6938): Uncaught exception thrown by finalizer
07-09 11:54:05.465: E/System(6938): java.lang.IllegalStateException: Don't have database lock!
07-09 11:54:05.465: E/System(6938): at android.database.sqlite.SQLiteDatabase.verifyLockOwner(SQLiteDatabase.java:2227)
07-09 11:54:05.465: E/System(6938): at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2319)
07-09 11:54:05.465: E/System(6938): at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2315)
07-09 11:54:05.465: E/System(6938): at android.util.LruCache.trimToSize(LruCache.java:197)
07-09 11:54:05.465: E/System(6938): at android.util.LruCache.evictAll(LruCache.java:285)
07-09 11:54:05.465: E/System(6938): at android.database.sqlite.SQLiteDatabase.deallocCachedSqlStatements(SQLiteDatabase.java:2280)
07-09 11:54:05.465: E/System(6938): at android.database.sqlite.SQLiteDatabase.closeClosable(SQLiteDatabase.java:1252)
07-09 11:54:05.465: E/System(6938): at android.database.sqlite.SQLiteDatabase.finalize(SQLiteDatabase.java:2040)
07-09 11:54:05.465: E/System(6938): at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:182)
07-09 11:54:05.465: E/System(6938): at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:168)
07-09 11:54:05.465: E/System(6938): at java.lang.Thread.run(Thread.java:856)
extends SQLiteOpenHelper