一.概述
android中使用的数据库是sqlite,根据学习知识的wwh思想,我们抛出三个问题
第一:sqlite是什么(what)?
sqlite是用c语言写的一个开源嵌入式的,不需要服务器,没有配置的,事物性SQL数据库引擎,并且支持大多数的sql语法.是遵守ACID的关系型数据库管理系统.
第二:为什么使用sqlite呢(why)?
sqlite以功能强大,且占用内存较低著称.
- 轻量级 (只需要带一个动态库,并且这个动态库非常小,就是一个单文件)
- 独立性 (sqlite不需要依赖第三方软件,也不需要安装)
- 隔离性 (数据库中的所有信息都包含在一个文件夹内)
- 跨平台 (支持大部分操作系统)
- 多语言接口 (支持多语言java,c,c++等)
- 安全性 (多个进程可以在同一时间从同一个数据库中读取数据,但是只能允许一个进程进行写数据)
二.使用
1.支持的数据类型
sqlite支持的数据类型有text,null,integer,blob,real(依次分别是文本,空,整型,二进制对象,浮点型),注意它是一个弱类型
,什么叫弱类型呢?相信做过js开发的应该都知道在js当中进行变量声明都是使用var,不管是整型还是字符串,sqlite也是一样,虽然有区分字符串和整型,但是它自己还是会去检查插入的数据类型和声明的数据类型是否匹配,如果不一样sqlite会自动帮我们转.
2.sqlite在android当中的使用
首先创建数据库
public class MySqliteOpenHelper extends SQLiteOpenHelper {
//数据库名称
public static final String SQLITE_NAME = "test.db";
//当前数据库的版本
public static final int SQLITE_VERSION = 1;
//表名
public static final String SQLITE_TABLE_NAME = "student";
//创建表的语句
public static final String CREATE_TABLE = "CREATE TABLE " + SQLITE_TABLE_NAME + "(_id INTEGER PRIMARY KEY AUTOINCREMENT,name verchar(10),age integer)";
public MySqliteOpenHelper(Context context) {
super(context, SQLITE_NAME, null, SQLITE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据库
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//数据库版本升级的时候使用
}
}
3.通过数据库进行增删改查
public class SqliteManager {
public static final String SQL_INSERT = "insert into " + MySqliteOpenHelper.SQLITE_TABLE_NAME + "(name,age) values(?,?)";
public static final String SQL_SELECT = "select * from " + MySqliteOpenHelper.SQLITE_TABLE_NAME;
public static final String SQL_UPDATE = "update " + MySqliteOpenHelper.SQLITE_TABLE_NAME + " set name where age > ?";
private Context mContext;
public SqliteManager(Context context) {
this.mContext = context;
}
/***
* 插入单条数据(第一种方式)
*
* @param sqlitedatabase
* @param student
* @return
*/
public long insert(SQLiteDatabase sqlitedatabase, Student student) {
ContentValues mContentValues = new ContentValues();
mContentValues.put(Student.NAME, student.name);
mContentValues.put(Student.AGE, student.age);
return sqlitedatabase.insert(MySqliteOpenHelper.SQLITE_TABLE_NAME, null, mContentValues);
}
/***
* 批量插入数据(第二种方式)
*
* @param sqliteDatabase
* @param list
*/
public void insert(SQLiteDatabase sqliteDatabase, List<Student> list) {
long currentTimeMillis = System.currentTimeMillis();
try {
//开启事物
sqliteDatabase.beginTransaction();
for (Student student : list) {
sqliteDatabase.execSQL(SQL_INSERT, new Object[]{student.name, student.age});
}
//设置事物成功
sqliteDatabase.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
sqliteDatabase.endTransaction();
long timeMillis = System.currentTimeMillis();
ToastUtils.showToast(mContext, "批量插入1000条数据成功,耗时" + (timeMillis - currentTimeMillis) + "毫秒");
}
}
/***
* 查询数据库
*
* @param sqliteDatabase
* @return
*/
public List<Student> query(SQLiteDatabase sqliteDatabase) {
List<Student> list = new ArrayList<>();
Cursor cursor = sqliteDatabase.rawQuery(SQL_SELECT, null);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
int id = cursor.getInt(cursor.getColumnIndex("_id"));
list.add(new Student(id, name, age));
}
if (!cursor.isClosed()) {
cursor.close();
}
return list;
}
/***
* 更新语句
*
* @param sqLiteDatabase
* @param values
* @param whereClause
* @param whereArgs
*/
public int update(SQLiteDatabase sqLiteDatabase, ContentValues values, String whereClause, String[] whereArgs) {
return sqLiteDatabase.update(MySqliteOpenHelper.SQLITE_TABLE_NAME, values, whereClause, whereArgs);
}
/***
* 删除数据
*
* @param sqLiteDatabase
* @param whereClause
* @param whereArgs
* @return 返回结果表示删除了多少条数据
*/
public int delete(SQLiteDatabase sqLiteDatabase, String whereClause, String[] whereArgs) {
return sqLiteDatabase.delete(MySqliteOpenHelper.SQLITE_TABLE_NAME, whereClause, whereArgs);
}
}
主activity中代码如下
public class SqliteActivity extends Activity implements View.OnClickListener {
@BindView(R.id.btn_insert_one)
Button btn_insert_one;
@BindView(R.id.btn_insert_trascation)
Button btn_insert_trascation;
@BindView(R.id.btn_update)
Button btn_update;
@BindView(R.id.btn_query)
Button btn_query;
@BindView(R.id.btn_delete)
Button btn_delete;
@BindView(R.id.tv_content)
TextView tv_content;
private Context mContext;
private MySqliteOpenHelper mSqliteOpenHelper;
private SQLiteDatabase mWritableDatabase;
private SQLiteDatabase mReadableDatabae;
private SqliteManager mManger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite);
ButterKnife.bind(this);
mContext = getApplicationContext();
mSqliteOpenHelper = new MySqliteOpenHelper(mContext);
mWritableDatabase = mSqliteOpenHelper.getWritableDatabase();
mReadableDatabae = mSqliteOpenHelper.getReadableDatabase();
mManger = new SqliteManager(mContext);
}
@OnClick({R.id.btn_insert_one, R.id.btn_query, R.id.btn_update, R.id.btn_delete, R.id.btn_insert_trascation})
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.btn_insert_one:
//点击插入数据, 这里特意插入一条字符串长度大于10的,就是为了证明sqlite是一个弱类型
long insertResult = mManger.insert(mWritableDatabase, new Student(1, "谢霆锋asdfadsfasdfasdfasdfasdfasdfasdfasdfasdfafd;lkad;离开;是地方阿斯顿附近卡是地方阿斯顿发生地方", 38));
if (insertResult != -1) {
ToastUtils.showToast(mContext, "插入数据成功");
} else {
ToastUtils.showToast(mContext, "插入数据失败");
}
break;
case R.id.btn_insert_trascation:
//批量插入数据
List<Student> mList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
mList.add(new Student("哈哈哈" + i, i));
}
mManger.insert(mWritableDatabase, mList);
break;
case R.id.btn_update:
//更新数据
ContentValues values = new ContentValues();
values.put(Student.NAME, "呵呵呵");
String whereClause = " _id > ? ";
String[] whereArgs = new String[]{"1000"};
int updateResult = mManger.update(mWritableDatabase, values, whereClause, whereArgs);
if (updateResult > 0) {
ToastUtils.showToast(mContext, "更新" + updateResult + "条数据成功");
}
break;
case R.id.btn_query:
//查询数据
List<Student> list = mManger.query(mReadableDatabae);
StringBuilder result = new StringBuilder();
for (Student student : list) {
result.append("id=" + student.id + "==name=" + student.name + "==age=" + student.age + "\n");
}
tv_content.setText(result.toString());
break;
case R.id.btn_delete:
//删除数据
int deleteResult = mManger.delete(mWritableDatabase, Student.NAME + " like ?", new String[]{"哈哈哈%"});
if (deleteResult > 0) {
ToastUtils.showToast(mContext, "删除" + deleteResult + "条数据成功");
}
break;
}
}
}
还有一些细节,明天再补充