Java Android SQLite ModernAsyncTask 1

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

我已经构建了我的数据库模式,并继续指定查询、更新、添加和删除数据库条目的方法,但是在启动应用程序时,我收到一个ModernAsyncTask错误。我在android文档中读到了这方面的内容,但不知道如何实现AsyncTask以最大限度地减少内存泄漏。我的日志说异常发生在doInBackground期间有人知道这里可能出了什么问题吗?我想确认我可以向数据库添加数据、查询数据、更新数据,甚至删除数据

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由于没有在数据库设置中实现而导致内存泄漏。我需要为此创建一个特殊的类吗?如果需要,我该如何做/我应该记住什么?