Java Android SQLite ModernAsyncTask 1
我已经构建了我的数据库模式,并继续指定查询、更新、添加和删除数据库条目的方法,但是在启动应用程序时,我收到一个ModernAsyncTask错误。我在android文档中读到了这方面的内容,但不知道如何实现AsyncTask以最大限度地减少内存泄漏。我的日志说异常发生在doInBackground期间有人知道这里可能出了什么问题吗?我想确认我可以向数据库添加数据、查询数据、更新数据,甚至删除数据Java Android SQLite ModernAsyncTask 1,java,android,android-fragments,android-activity,android-sqlite,Java,Android,Android Fragments,Android Activity,Android Sqlite,我已经构建了我的数据库模式,并继续指定查询、更新、添加和删除数据库条目的方法,但是在启动应用程序时,我收到一个ModernAsyncTask错误。我在android文档中读到了这方面的内容,但不知道如何实现AsyncTask以最大限度地减少内存泄漏。我的日志说异常发生在doInBackground期间有人知道这里可能出了什么问题吗?我想确认我可以向数据库添加数据、查询数据、更新数据,甚至删除数据 import android.database.sqlite.SQLiteDatabase; imp
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
public class MyDBHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "contactsDB.db";
public static final String TABLE_CONTACTS = "contacts";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_NAME = "name";
public static final String COLUMN_PHONE = "phone";
public static final String COLUMN_STATUS = "status";
public static final String COLUMN_BLURB = "blurb";
public MyDBHandler(Context context, String name,
CursorFactory factory, int version) {
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
@Override
public void onCreate (SQLiteDatabase db){
String CREATE_CONTACTS_TABLE = "CREATE TABLE " +
TABLE_CONTACTS + "("
+ COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_NAME
+ " TEXT," + COLUMN_PHONE + " INTEGER,"
+ COLUMN_STATUS + " TEXT," + COLUMN_BLURB
+ " TEXT" + ")";
db.execSQL(CREATE_CONTACTS_TABLE);
}
@Override
public void onUpgrade (SQLiteDatabase db,int oldVersion, int newVersion){
db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
onCreate(db);
}
public void addContact(ContactsDb contacts) {
ContentValues values = new ContentValues();
values.put(COLUMN_NAME, contacts.getName());
values.put(COLUMN_PHONE, contacts.getPhone());
values.put(COLUMN_STATUS, contacts.getStatus());
values.put(COLUMN_BLURB, contacts.getBlurb());
SQLiteDatabase db = this.getWritableDatabase();
db.insert(TABLE_CONTACTS, null, values);
db.close();
}
public ContactsDb findContact(String name) {
String query = "Select * FROM " + TABLE_CONTACTS + " WHERE " + COLUMN_NAME + " = \"" + name + "\"";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
ContactsDb contacts = new ContactsDb();
if (cursor.moveToFirst()) {
cursor.moveToFirst();
contacts.setID(Integer.parseInt(cursor.getString(0)));
contacts.setName(cursor.getString(1));
contacts.setPhone(Integer.parseInt(cursor.getString(2)));
contacts.setStatus(cursor.getString(3));
contacts.setBlurb(cursor.getString(4));
cursor.close();
} else {
contacts = null;
}
db.close();
return contacts;
}
public void updateContact(ContactsDb contacts) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_STATUS, contacts.getStatus());
values.put(COLUMN_BLURB, contacts.getBlurb());
// Which row to update, based on the ID
String selection = COLUMN_ID + " LIKE ?";
String[] selectionArgs = { String.valueOf(contacts.getID()) };
int count = db.update(
TABLE_CONTACTS,
values,
selection,
selectionArgs);
db.close();
}
public boolean deleteContact(String name) {
boolean result = false;
String query = "Select * FROM " + TABLE_CONTACTS + " WHERE " + COLUMN_NAME + " = \"" + name + "\"";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
ContactsDb contacts = new ContactsDb();
if (cursor.moveToFirst()) {
contacts.setID(Integer.parseInt(cursor.getString(0)));
db.delete(TABLE_CONTACTS, COLUMN_ID + " = ?",
new String[] { String.valueOf(contacts.getID()) });
cursor.close();
result = true;
}
db.close();
return result;
}
}
干杯,谢谢你抽出时间
04-29 05:48:39.390 7446-7465/treehouse.greenlight E/AndroidRuntime﹕ FATAL EXCEPTION: ModernAsyncTask #1
Process: treehouse.greenlight, PID: 7446
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.support.v4.content.ModernAsyncTask$3.done(ModernAsyncTask.java:137)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:811)
Caused by: java.lang.IllegalArgumentException: Invalid column data1
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:413)
at android.content.ContentResolver.query(ContentResolver.java:475)
at android.content.ContentResolver.query(ContentResolver.java:418)
at android.support.v4.content.CursorLoader.loadInBackground(CursorLoader.java:49)
at android.support.v4.content.CursorLoader.loadInBackground(CursorLoader.java:35)
at android.support.v4.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:242)
at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:51)
at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:40)
at android.support.v4.content.ModernAsyncTask$2.call(ModernAsyncTask.java:123)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
位于java.util.concurrent.ThreadPoolExecutor.runWorkerThreadPoolExecutor.java:1112
位于java.util.concurrent.ThreadPoolExecutor$Worker.runThreadPoolExecutor.java:587
java:811
04-29 05:48:39.410 7446-7446/treehouse.greenlight E/ViewRootImpl﹕ missensupport::false您必须在问题中更加具体,并表明您的流程序列活动会出现此错误。此错误不是数据库的错误,而是超出了仿真器或虚拟机的容量。无论如何,检查配置文件并更新以下值: -launcher.XXMaxPermSize 256M -launcher.XXMaxPermSize 256m -Xms512m
-Xmx1024m看,错误与数据库不完全相关。通常,android上不会出现逻辑数据库错误。您显示的示例代码不是生成错误的代码。显然,您可以根据以下条件控制和管理数据库: 1.要知道Android在你的数据库中有一个不可侵犯的空间。 2.构建派生的MyDBHandler时,onCreate会自动运行。 3.如果在onCreate中包含表的创建,则必须将..getWritableDatabase放置在构造函数或onCreate中。 4.但是要知道,当您使用getWritableDatabase或getReadableDatabase时,必须正确处理SQLException,而您的代码则不能。 5.如果你能理解你的逻辑,在你的问题中围绕着你的项目,那将是一件很好的事情。
关于发布您的AsyncTask代码和logcatI没有任何AsyncTask代码-正如我上面所说,我对如何实现它感到非常困惑。我已经包括了上面的日志。它说IllegalArgumentException为什么它会与内存大小相关?我认为这个想法是AsyncTask由于没有在数据库设置中实现而导致内存泄漏。我需要为此创建一个特殊的类吗?如果需要,我该如何做/我应该记住什么?