类DbHelper:

import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DbHelper extends SQLiteOpenHelper {    //数据库名字    private static final String DATABASE_NAME = "lindb";    //数据库版本    private static final int DATABASE_VERSION = 100;    private DbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);    }    public DbHelper(Context context) {        this(context, DATABASE_NAME, null, DATABASE_VERSION);    }    @Override    public void onCreate(SQLiteDatabase db) {        //创建学生表        db.execSQL("create table students(id integer primary key autoincrement,name text )");    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        //处理版本升级        //添加字段         //ALTER TABLE table_name ADD column_name datatype        //ALTER TABLE table_name DROP COLUMN column_name          }}

类DbManager:

import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.util.Log;import java.util.concurrent.atomic.AtomicInteger;public class DbManager {    //线程安全的i++或i--操作,初始值为0    private AtomicInteger openCounter = new AtomicInteger(0);    //数据库管理单例    private static DbManager instance;    //要管理的数据库    private static SQLiteDatabase database;    private DbHelper dbHelper;    private DbManager(Context context) {        dbHelper = new DbHelper(context);    }    /**     * 需要在Application     * 初始化数据库单例     *     * @param context     */    public static void initDbManager(Context context) {        if (instance == null) {            instance = new DbManager(context);        }    }    /**     * 同步获取该数据库管理类单例     */    public static synchronized DbManager getInstance() {        if (instance == null) {            throw new IllegalStateException("DbManager is not init in application");        }        return instance;    }    /**     * 这个方法可能需要很长时间才能返回,     * 所以你不应该从应用程序主线程调用它,     * 包括from ContentProvider.onCreate()     */    public SQLiteDatabase openDb() {        Log.v("Lin2", "openDb:" + openCounter.get());        if (openCounter.incrementAndGet() == 1) {            Log.v("Lin2", "打开了db");            database = dbHelper.getWritableDatabase();        } else {            Log.v("Lin2", "返回打开的db");        }        return database;    }    public void closeDb() {        Log.v("Lin2", "closeDb:" + openCounter.get());        if (openCounter.decrementAndGet() == 0) {            Log.v("Lin2", "关闭了db");            database.close();        } else {            Log.v("Lin2", "还有其他线程操作db");        }    }}

在Application中初始化:

import android.app.Application;public class AppInit extends Application {    @Override    public void onCreate() {        super.onCreate();        DbManager.initDbManager(getApplicationContext());    }}

MainActivity:

import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Thread1 T1 = new Thread1();        T1.start();        Thread2 T2 = new Thread2();        T2.start();    }    class Thread1 extends Thread {        public void run() {            Log.v("Lin2", "Running Thread1");            try {                DbManager.getInstance().openDb();                for (int i = 5; i > 0; i--) {                    Log.v("Lin2", "Thread: Thread1" + ", " + i);                    // 模拟数据库操作                    Thread.sleep(1000);                }                DbManager.getInstance().closeDb();            } catch (InterruptedException e) {                Log.v("Lin2", "Thread: Thread1" + ", " + " interrupted.");            }            Log.v("Lin2", "Thread: Thread1" + ", " + " exiting.");        }    }    class Thread2 extends Thread {        public void run() {            Log.v("Lin2", "Running Thread2");            try {                DbManager.getInstance().openDb();                for (int i = 10; i > 0; i--) {                    Log.v("Lin2", "Thread: Thread2" + ", " + i);                    // 模拟数据库操作                    Thread.sleep(1000);                }                DbManager.getInstance().closeDb();            } catch (InterruptedException e) {                Log.v("Lin2", "Thread: Thread2" + ", " + " interrupted.");            }            Log.v("Lin2", "Thread: Thread2" + ", " + " exiting.");        }    }}

打印的数据:

data.png

数据库操作类

import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.util.Log;import java.util.ArrayList;import java.util.List;public class DbHandle {    /**     * 添加名字     *     * @param name     * @return 是否添加成功     */    public static boolean insertStudents(String name) {        ContentValues contentValues = new ContentValues();        SQLiteDatabase database = DbManager.getInstance().openDb();        database.beginTransaction();        contentValues.put("name", name);        long execSql = database.insert("students", null, contentValues);        contentValues.clear();        database.setTransactionSuccessful();        database.endTransaction();        //关闭database        DbManager.getInstance().closeDb();        return execSql != -1;    }    /**     * 查找所有的名字     *     * @return 名字列表     */    public static List getNameList() {        List list = new ArrayList<>();        SQLiteDatabase database = DbManager.getInstance().openDb();        Cursor cursor = database.query("students", null, null,                null, null, null, null);        if (cursor != null) {            while (cursor.moveToNext()) {                list.add(cursor.getString(cursor.getColumnIndex("name")));            }            cursor.close();        }        DbManager.getInstance().closeDb();        return list;    }    /**     * 删除     *     * @param name     * @return 删除的行数     */    public static int delName(String name) {        SQLiteDatabase database = DbManager.getInstance().openDb();        int delNumber = database.delete("students", "name=?", new String[]{name});        DbManager.getInstance().closeDb();        return delNumber;    }    /**     * 修改     *     * @param newName 修改后的     * @param oldName 要修改的     * @return 修改的行数     */    public static int updateName(String newName, String oldName) {        ContentValues contentValues = new ContentValues();        SQLiteDatabase database = DbManager.getInstance().openDb();        database.beginTransaction();        contentValues.put("name", newName);        int updateNumber = database.update("students", contentValues, "name=?", new String[]{oldName});        contentValues.clear();        database.setTransactionSuccessful();        database.endTransaction();        DbManager.getInstance().closeDb();        return updateNumber;    }    /**     * 以上增删改查的方法查看源代码就会知道最终执行是拼接的sql语句,但这些方法有时候并不能为所欲为。     * 下面是直接运用sql语句来实现增删改查     */    //增 insert into students(name) values('xxx')    public static void insertBySql(String name) {        SQLiteDatabase database = DbManager.getInstance().openDb();        database.beginTransaction();        try {            database.execSQL("insert into students(name) values ('" + name + "')");        } catch (Exception e) {            Log.e("Lin2", "students插入失败原因:" + e.getMessage());        } finally {            database.setTransactionSuccessful();            database.endTransaction();            DbManager.getInstance().closeDb();        }    }    //删 delete from students where name='xxx'    public static void delBySql(String name) {        SQLiteDatabase database = DbManager.getInstance().openDb();        try {            database.execSQL("delete from students where name='" + name + "'");        } catch (Exception e) {            Log.e("Lin2", "students删除失败原因:" + e.getMessage());        } finally {            DbManager.getInstance().closeDb();        }    }    //改 update students set name='xx' where name='xx'    public static void updateBySql(String newName, String oldName) {        SQLiteDatabase database = DbManager.getInstance().openDb();        database.beginTransaction();        try {            database.execSQL("update students set name='" + newName + "'" + "where name='" + oldName + "'");        } catch (Exception e) {            Log.e("Lin2", "students更新失败原因:" + e.getMessage());        } finally {            database.setTransactionSuccessful();            database.endTransaction();            DbManager.getInstance().closeDb();        }    }      //查 select * from students    public static List getListBySql() {        List list = new ArrayList<>();        SQLiteDatabase database = DbManager.getInstance().openDb();        try {            Cursor cursor = database.rawQuery("select * from students", null);            if (cursor != null) {                while (cursor.moveToNext()) {                    list.add(cursor.getString(cursor.getColumnIndex("name")));                }                cursor.close();            }        }catch (Exception e){            Log.e("Lin2", "students查询失败原因:" + e.getMessage());        }finally {            DbManager.getInstance().closeDb();        }              return list;    }    /**     * 以上是都是简单的基础的sql      */

更多相关文章

  1. GreenDao 连接与关闭Sqlite数据库
  2. viewModel与recyclerView结合
  3. Android中Assets下文件操作
  4. Android(安卓)数据库的问题
  5. android > 获取当前位置
  6. Android(安卓)有时环信初始化失败,创建applocation失败
  7. android写入数据库、读取sqlite中的图片
  8. Android(安卓)使用Room 生成不了数据库文件
  9. 懒加载fragment基类

随机推荐

  1. Android之调用系统Email发送邮件
  2. android中度量坐标 传感器应用的开发
  3. android中渐变效果
  4. Android Handler ExecutorService(线程池
  5. 禁用Android底部虚拟按键
  6. Android小游戏开发流程有感
  7. android 基本组件
  8. Android例子源码集成安卓主流优秀第三方
  9. solution for Failed to create the SD c
  10. Android(安卓)textview 不使用ScrollView