java - 线程上的数据库操作

标签 java android multithreading

我正在开发一个 Android 应用程序,它在数据库中存储一些数据,当用户启动应用程序时,它会将数据从数据库获取到 ArrayList,并在整个应用程序生命周期中保留该 ArrayList.每当我需要更新数据时,我都会更新数据库和保存数据的 ArrayList,这种方法减少了 CPU 工作量。这里我必须通过非ui线程更新数据库,所以我需要一些建议,

1-这是一个好方法吗?

2-我有一个直接与数据库交互的数据库帮助程序类,并且我为每个表维护单独的类,它与 UI 和数据库帮助程序类进行通信,所以我应该在哪里实现 thread ,无论是在 Helper 类中或者表中对应的类?

代码

数据库处理程序

    @Override
        public void onCreate(SQLiteDatabase db) {
            FirstTable.createDatabaseTable(db);
            SecondTable.createDatabaseTable(db);
        }

 public void insertData(String tableName, ContentValues contentValues) {
        SQLiteDatabase db = getWritableDatabase();
        db.insert(tableName, null, contentValues);
        dbClose();
    }

    public Cursor readData(String tableName, String[] columns, String selection, String[]
            selectionArgs, String groupBy, String having, String orderBy, String limit) {
        SQLiteDatabase db = getWritableDatabase();
        Cursor cursor = db.query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
        return cursor;
    }

    public void deleteData(String tableName, String id, NewsItem newsItem) {
        SQLiteDatabase db = getWritableDatabase();

        db.delete(tableName, id + " =?", new String[]{String.valueOf(newsItem.getmGuid())});
        dbClose();
    }


    public void updateData(String tableName, ContentValues contentValues, String where, String[] whereArgs) {
        SQLiteDatabase db = getWritableDatabase();
        db.update(tableName, contentValues, where, whereArgs);
        dbClose();
    }

    public void dbClose() {
        if (mDbHandler != null) {
            mDbHandler.close();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        FirstTable.deleteTable(db);
        SecondTable.deleteTable(db);
        onCreate(db);
    }

表特定类

public static void createDatabaseTable(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE);
}

public static void deleteTable(SQLiteDatabase db) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
}

public void createData(Data data) {
    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_TITLE, data.getTitle());
    contentValues.put(COLUMN_LINK, data.getLink());

    DbHandler dbHandler = DbHandler.getInstance(mContext);
    dbHandler.insertData(TABLE_NAME, contentValues);
}

public ArrayList<NewsItem> readData() {
    ArrayList<Data> allData = new ArrayList<>();
    DbHandler dbHandler = DbHandler.getInstance(mContext);

    Cursor cursor = dbHandler.readData(TABLE_NAME, null, null, null, null, null, null, null);
    if (cursor.moveToFirst()) {
        do {
            Data data = new Data();
            data.setTitle(cursor.getString(2));
            data.setLink(cursor.getString(3));
            allNewsList.add(newsItem);
        } while (cursor.moveToNext());
    }
    return allData;
}

public void deleteData(Data data) {
    DbHandler dbHandler = DbHandler.getInstance(mContext);
    dbHandler.deleteData(TABLE_NAME, ID,  data);
}

给我推荐一个好的方法

最佳答案

是的,在后台进程中存储和维护数据是个好主意。我想建议您创建一个通用类来处理数据库和表。

例如

公共(public)类DatabaseHandler扩展了SQLiteOpenHelper{

// All Static variables
// Database Version
private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "demo_database";

// Contacts table name
private static final String TABLE_CONTACTS = "contacts";
private static final String TABLE_PROINFO = "proinfo";
private static final String TABLE_RETAPROINFO = "retaproinfo";

private static final String TABLE_ATTENDANCE = "attendance";

// Contacts Table Columns names
private static final String KEY_ID = "id";
private static final String KEY_STUDID = "studid";
private static final String KEY_AVAILABILITY = "availability";




private final ArrayList<Bean_attendance> att_list = new ArrayList<Bean_attendance>();





public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

SQLiteDatabase db;
Cursor cursor;



// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {

    String CREATE_CATEGORY_NAME_TABLE = "CREATE TABLE " + TABLE_ATTENDANCE
            + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_STUDID + " TEXT,"
            + KEY_AVAILABILITY + " TEXT"  + ")";





    db.execSQL(CREATE_CATEGORY_NAME_TABLE);



}

// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // Drop older table if existed

    int upgradeTo = oldVersion + 1;
    while (upgradeTo <= newVersion) {
        switch (upgradeTo) {
        case 1:


            db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTENDANCE);


            break;
        case 2:


            db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTENDANCE);

            break;
        case 3:


            db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTENDANCE);


            break;
        case 4:

            db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTENDANCE);


            break;
        case 5:


            db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTENDANCE);


            break;
        case 6:


            db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTENDANCE);


            break;
        case 7:


            db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTENDANCE);


            break;
        case 8:


            db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTENDANCE);


            break;
        case 9:

            db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTENDANCE);


            break;
        case 10:


            db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTENDANCE);


            break;
        case 11:


            db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTENDANCE);


            break;
        case 12:


            db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTENDANCE);


            break;
        }
        upgradeTo++;
    }


    // Create tables again
    onCreate(db);
}

/**
 * All CRUD(Create, Read, Update, Delete) Operations
 */



public void Add_Attandance(Bean_attendance contact) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_STUDID, contact.getStud_id());
    values.put(KEY_AVAILABILITY, contact.getAvailability());


    // Inserting Row
    db.insert(TABLE_ATTENDANCE, null, values);
    db.close(); // Closing database connection
}





public ArrayList<Bean_attendance> Get_Attandance() {
    try {
        att_list.clear();

        // Select All Query
        String selectQuery = "SELECT  * FROM " + TABLE_ATTENDANCE;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                Bean_attendance contact = new Bean_attendance();
                contact.setId(Integer.parseInt(cursor.getString(0)));
                contact.setStud_id(cursor.getString(1));
                contact.setAvailability(cursor.getString(2));

                // Adding contact to list
                att_list.add(contact);
            } while (cursor.moveToNext());
        }

        // return contact list
        cursor.close();
        db.close();
        return att_list;
    } catch (Exception e) {
        // TODO: handle exception
        Log.e("all_attandance", "" + e);
    }

    return att_list;
}







public int Update_MainAttandnce(String availble,int id) {
    String countQuery = "UPDATE " + TABLE_ATTENDANCE + " SET " + KEY_AVAILABILITY
            + " = " + "\"" + availble + "\""  + " where " + KEY_ID + "=" + "\"" + id
            + "\"";
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
    int count = cursor.getCount();
    cursor.close();
    // return count
    return count;

}



public void Delete_Attandance_main(int id) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_ATTENDANCE, KEY_ID + "=" + id, null);
    db.close();

}

public void Attandanceremove() {
    SQLiteDatabase db = this.getWritableDatabase();
    // context.deleteDatabase(DATABASE_NAME);

    db.execSQL("delete from " + TABLE_ATTENDANCE);

    // db.delete(DATABASE_TABLE, null, null);
}

}

关于java - 线程上的数据库操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31934034/

相关文章:

java - 带参数的 for 循环中的多线程

java - 生成对称图片的算法

java - 如何使用格式化程序将请求绑定(bind)到表单命令对象的 int 属性的空字符串 http 参数默认为 0?

java - Facebook 登录按钮未显示在 ActionbarActivity 中

java - 如何选择线程池大小?

java - 为什么动态绑定(bind)和从父类调用子方法的设计不同?

java - 在发布到 phpmyadmin 时询问 asynctask

android - Gradle + Cmake 在连接路径时添加意外的引号

C#函数意识?

java - 简单线程串联运行? (第二个线程在第一个线程停止之前不会运行)