本文主要对数据库的创建和使用
前言:
SQLite数据库是D.Richard Hipp用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征:
1、轻量级
SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。
2、独立性
SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”,所以在使用的时候能够省去不少麻烦。
3、隔离性
SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。
4、跨平台
SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,比如Android、Windows Mobile、Symbian、Palm等。
5、多语言接口
SQLite数据库支持很多语言编程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多开发者的喜爱。
6、安全性
SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。
SQLite官方网站(http://www.sqlite.org),了解更多内容请前往。
1.创建MySqliteHelper继承SQLiteOpenHelper帮助类/**
* aqliteOpenHelper
* 1.提供了onCreate() onUpgrade() 等创建数据库更新数据库的方法
* 2.提供了获取数据库对象的函数
* 3.数据库创建了一次就不会再走onCreate的方法
*/
public class MySqliteHelper extends SQLiteOpenHelper {
/**
* 构造函数
* @param context 上下文对象
* @param name 表示创建数据库的名称
* @param factory 游标工厂
* @param version 表示创建数据库的版本 >=1
*/
public MySqliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public MySqliteHelper(Context context) {
super(context, Constant.DATABASE_NAME, null, Constant.DATABASE_VERSION);
}
/**
* 当数据库创建时回调的函数
* @param sqLiteDatabase 数据库对象
*/
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
Log.i("tag" ,"--------onCreate-------");
String sql = "create table " + Constant.TABLE_NAME +"("+ Constant._ID +" Integer primary key ," +
""+ Constant.NAME + "varchar(10)," + Constant.AGE + " Integer)";
sqLiteDatabase.execSQL(sql); //执行sql语句
}
/**
* 当数据库版本更新时回调的函数
* @param sqLiteDatabase 数据库对象
* @param i 数据库旧版本
* @param i1 数据库新版本
*/
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
Log.i("tag" ,"--------onUpgrade-------");
}
/**
* 当数据库打开时回调的函数
* @param db 数据库对象
*/
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
Log.i("tag" ,"--------onOpen-------");
}
}
2.创建一个Constant常量类 方便以后更改数据
**
* 常量类 便于修改
* DATABASE_NAME后期更改只需要更改后面的变量 "info.db"更改 前面的常亮不需要更改
*/
public class Constant {
public static final String DATABASE_NAME = "info.db"; //数据库名称
public static final int DATABASE_VERSION = 1; //数据库的版本号
public static final String TABLE_NAME = "person"; // 表名
public static final String _ID = "_id" ;
public static final String NAME = "name" ;
public static final String AGE = "age" ;
}
3.创建DbManager 主要是对数据库操作的工具类
public class DbManger {
private static MySqliteHelper helper ;
/**
* 单列模式
*/
public static MySqliteHelper getIntance (Context context){
if (helper == null){
helper = new MySqliteHelper(context);
}
return helper;
}
/**
* 根据sql语句在数据库中执行语句
* @param db 数据库对象
* @param sql sql语句
*/
public static void execSQL(SQLiteDatabase db , String sql ){
if (db != null){
if (sql != null && "".equals(sql)){
db.execSQL(sql);
}
}
}
}
public class MainActivity extends AppCompatActivity {
private MySqliteHelper mMySqliteHelper;
private SQLiteDatabase mDb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获得数据库帮助类对象
mMySqliteHelper = DbManger.getIntance(this);
}
/**
* 创建数据库
* @param view
*/
public void createDb(View view){
/**
* getWritableDatabase() getReadableDatabase() 创建或打开数据库
* 如果数据库不存在则创建数据库 如果数据库存在直接打开数据库
* 默认情况下两个函数都表示打开或者创建可读可写的数据库对象 如果磁盘已满或者是数据库本身的权限等情况下
* getReadableDatabase() 打开的是只读数据库
*/
SQLiteDatabase db = mMySqliteHelper.getWritableDatabase();
}
//
public void click(View view){
switch (view.getId()){
// 插入数据
case R.id.btn_insert:
mDb = mMySqliteHelper.getWritableDatabase();
String insert_sql = "inster into "+ Constant.TABLE_NAME +" values(1,'ZhangSan',20)";
DbManger.execSQL(mDb,insert_sql);
String insetrt_sql2 = "inster into " + Constant.TABLE_NAME + " values(2,'LiSi',30)";
DbManger.execSQL(mDb,insetrt_sql2);
mDb.close();
break;
//修改数据
case R.id.btn_update:
mDb = mMySqliteHelper.getReadableDatabase();
// String upDate_sql = "update person set name = 'XiaoMing' where _id =1" ;
String upDate_sql = "update "+ Constant.TABLE_NAME+" set " +
""+Constant.NAME+" = 'XiaoMing' where "+Constant._ID+" =1" ;
DbManger.execSQL(mDb,upDate_sql);
mDb.close();
break;
//删除语句
case R.id.btn_delete:
mDb = mMySqliteHelper.getWritableDatabase();
String delet_sql = "delete from "+ Constant.TABLE_NAME +" where "+Constant._ID +" = 2";
DbManger.execSQL(mDb,delet_sql);
mDb.close();
}
}
// API文档调用增删改
public void onClick(View view){
switch (view.getId()){
case R.id.btn_insertapi:
mDb = mMySqliteHelper.getWritableDatabase();
/**
* inseter (String table ,String nullColumnHack , ContentValues values)
* String table 表示插入数据表的名称
* String nullColumnHack null值
* ContentValues values 键为String 类型的Hashmap集合
* 返回值 log 表示插入数据列数
*/
ContentValues values = new ContentValues();
values.put(Constant._ID,3); //put (表示插入字段的名称 ,表示插入的具体值)
values.put(Constant.NAME,"王五");
values.put(Constant.AGE,29);
long result = mDb.insert(Constant.TABLE_NAME,null,values );
if (result>0){
Toast.makeText(this,"插入数据成功",Toast.LENGTH_LONG).show();
}else {
Toast.makeText(this,"插入数据失败",Toast.LENGTH_LONG).show();
}
mDb.close();
break;
case R.id.btn_updateapi:
mDb = mMySqliteHelper.getWritableDatabase();
/**
*update(String table, ContentValues values, String whereClause, String[] whereArgs)
* String table 表示修改数据库的名称
* ContentValues values 表示键为String 类型的hashmap
* String whereClause 表示修改条件
* String[] whereArgs 表示修改条件的占位符
*返回值表示修改的条数
*/
ContentValues count_values = new ContentValues();
count_values.put(Constant.TABLE_NAME,"小牧"); //(修改需要的字段名称,修改后的字段值)
//int count = mDb.update(Constant.TABLE_NAME,count_values,Constant._ID+"=3",null); //两种写法
int count = mDb.update(Constant.TABLE_NAME,count_values,Constant._ID+"=?",new String[]{"3"});
if (count>0){
Toast.makeText(this,"修改数据成功",Toast.LENGTH_LONG).show();
}else {
Toast.makeText(this,"修改数据失败",Toast.LENGTH_LONG).show();
}
mDb.close();
break;
case R.id.btn_deleteapi:
mDb = mMySqliteHelper.getWritableDatabase();
/**
* String table 删除的表名
* String whereClause 删除的条件
* String[] whereArgs 删除条件的占位符
*/
int delete = mDb.delete(Constant.TABLE_NAME,Constant._ID+"=?",new String[]{"1"});
if (delete>0){
Toast.makeText(this,"删除数据成功",Toast.LENGTH_LONG).show();
}else {
Toast.makeText(this,"删除数据失败",Toast.LENGTH_LONG).show();
}
mDb.close();
break;
}
}
}
最后我把xml文件也贴给大家
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.unruly_zhao.unruly_sqlite.MainActivity"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="创建数据库"
/>
<Button
android:id="@+id/btn_insert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="插入数据"
android:layout_marginTop="20dp"
android:onClick="click"/>
<Button
android:id="@+id/btn_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改数据"
android:layout_marginTop="20dp"
android:onClick="click"/>
<Button
android:id="@+id/btn_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除数据"
android:layout_marginTop="20dp"
android:onClick="click"/>
<!--通过api的形式插入-->
<Button
android:id="@+id/btn_insertapi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="插入数据_API方式"
android:layout_marginTop="20dp"
android:onClick="onClick"/>
<Button
android:id="@+id/btn_updateapi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改数据_API方式"
android:layout_marginTop="20dp"
android:onClick="onClick"/>
<Button
android:id="@+id/btn_deleteapi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除数据_API方式"
android:layout_marginTop="20dp"
android:onClick="onClick"/>
</LinearLayout>