SQLite数据库存储(创建数据库,升级数据库和增删改查四种基本操作)
参考书籍:第一行代码
我们Android系统是内置了数据库的,在SDK中的platform-tools文件夹中。
SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百k的内存就足够了,因此比较适合在移动设备上使用。
创建数据库
首先我们需要创建一个自己的帮助类,去继承于SQLiteOpenHelper这个帮助类。SQLiteOpenHelper中有两个抽象方法,一个是onCreate()方法,在这个方法中实现创建数据库的逻辑。一个是onUpgrade()方法,在这个方法中实现升级数据库的逻辑。
MyDatabaseHelper .java 类
public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table book(" + "id integer primary key autoincrement," + "author text," + "price real," + "pages integer," + "name text)"; private Context mcontext; public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mcontext = context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); Toast.makeText(mcontext,"创建成功",Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
我们把创建数据库的SQL语句定义成一个常量,然后在onCreate()方法中去调用SQLiteDatabase的execSQL()方法中去执行这条创建表的语句,并弹出创建成功的语句。这样在创建数据库的同时也可以把表创建了。
SQLite的数据类型比较简单,我们这里简单讲一下,
integer 表示整型 real 表示浮点型 text 表示文本类型 blob 表示二进制类型
acticity_main.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" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/create_database" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="创建数据库"/> </LinearLayout>
这里加了一个按钮,用于创建数据库。
MainActivity.java代码
public class MainActivity extends AppCompatActivity { private MyDatabaseHelper myDatabaseHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //帮助类对象 myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,1); Button createDatabase = findViewById(R.id.create_database);//添加创建数据库的按钮控件 createDatabase.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myDatabaseHelper.getWritableDatabase();//创建数据库 } }); } }
这里在onCreate()方法中构建了一个MyDatabaseHelper对象,并且通过构造函数的参数,第一个参数是场景,第二个参数为数据库名(记得要加后缀.db,不然他会认为不是个SQLite数据库),第三个参数是游标,第四个参数是版本号(第一次创建就写1,用于升级)。
创建数据库提供了两种方法,一个是getReadableDatabase()方法和getWritableDatabase()方法。这两个方法都可以创建或打开一个数据库(如果数据库已存在就直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。我这里用的是getWritableDatabase()。
然后你就可以去运行这个程序了。它存在在**/data/data/你的包名/databases/**目录下。但是表你无法通过它查看,我这里用的是SQLite Expert Professional查询。你把数据库文件保存到本地桌面上,然后将他拖进SQLite Expert Professional中,就可以查看到了,但是SQLite Expert Professional有一个不好的地方,你每次往数据库里添加了东西,都要重新导入SQLite Expert Professional中,他相当于一个离线的,不能同步刷新。
现在是什么数据都没有的,因为我们还没有往里面加数据。
SQLite Expert Professional下载网址:https://www.7down.com/soft/4072.html
升级数据库
MyDatabaseHelper .java 类
public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table book(" + "id integer primary key autoincrement," + "author text," + "price real," + "pages integer," + "name text)"; public static final String CREATE_CATEGORY = "create table Category(" + "id integer primary key autoincrement," + "category_name text," + "category_code integer)"; private Context mcontext; public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mcontext = context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY); Toast.makeText(mcontext,"创建成功",Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table if exists Book"); db.execSQL("drop table if exists Category"); onCreate(db); } }
这里我们新建了一个表Category,然后在onUpgrade()方法中执行了两条drop语句,如果数据库中存在这两个表,就将他们删掉,重新调用onCreate()方法去重新创建。如果要让这个onUpgrade()方法可以执行,就要去更改一下MainActivity.java代码中的构造函数的第四个参数版本号,我们之前传的是1,现在只要传一个比1大的数就行了。
MainActivity.java代码
public class MainActivity extends AppCompatActivity { private MyDatabaseHelper myDatabaseHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //帮助类对象 myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,2); Button createDatabase = findViewById(R.id.create_database);//添加创建数据库的按钮控件 createDatabase.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myDatabaseHelper.getWritableDatabase();//创建数据库 } }); } }
现在就可以重新运行一下程序,去SQLite Expert Professional中查看两个表是否被创建。
增删改查四种基本操作
安卓中提供了一系列用于增删改查的辅助性方法,如果你对SQL语句十分熟悉,你也可以用SQL语句来操作,根据每个人的习惯吧,这里我两个都会写到,不过会主要偏向于讲解Android的方法。
添加数据
SQLiteDatabase中提供了一个insert()方法,这个用于添加数据,它接收三个参数:
第一个参数是:表名。 第二个参数是:用于在未指定添加数据的情况下给某些可为空的列自动赋值null,一般我们用不到这个功能,传入null就行了。 第三个参数是:一个ContentValues对象,他提供了一系列的put()方法重载,用于向ContentValues中添加数据。 只要将表中的每一个列名和他所对应的带添加的值传进去就行了。
基本用法我们说完了,就看下代码吧!
activity_main.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" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/add_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="添加数据"/> </LinearLayout>
我们添加了一个按钮,用于添加数据。
MainActivity.java 代码
public class MainActivity extends AppCompatActivity { private MyDatabaseHelper myDatabaseHelper; SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //帮助类对象 myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,4); //先获取到SQLiteDatabase对象 db = myDatabaseHelper.getWritableDatabase();//创建数据库 //添加数据 Button addData = findViewById(R.id.add_daea);//添加数据的按钮控件 addData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //方法一:SQL语句添加数据 //db.execSQL("insert into Book(name,author,pages,price)values(?,?,?,?)",new String[]{"恶意","东野圭吾","300","28.88"}); //方法二:用Android方法添加数据 //使用 ContentValues来组装数据 ContentValues values= new ContentValues(); //开始放入第一条数据 values.put("name","天空不要为我掉眼泪"); values.put("author","微酸袅袅"); values.put("pages",239); values.put("price",23); //把数据插入到表中(表名,给我指定的值赋值为null,插入的数据对象) db.insert("Book",null,values);//插入第一条数据 //清空数据 values.clear(); //第二条数据 values.put("name","白夜行"); values.put("author","东野圭吾"); values.put("pages",239); values.put("price",28); //把数据插入到表中(表名,给我指定的值赋值为null,插入的数据对象) db.insert("Book",null,values);//插入第二条数据 Toast.makeText(MainActivity.this,"数据插入成功!",Toast.LENGTH_SHORT).show(); } }); } }
这里我把前面创建数据库的按钮删掉了,改成了,只要一启动这个程序,他就会自己创建数据库和表,不用我们手动去创建。
我们创建了一个全局的SQLiteDatabase对象,然后在获取这个SQLiteDatabase对象。在添加数据的按钮点击事件中去使用 ContentValues来组装数据,再把数据添加进表中。
现在可以运行一下程序,去SQLite Expert Professional中查看数据是否被加入。
可以看出,数据已经加入到表中了。
更新数据
接下来,我们来看看怎么样修改表中的数据。SQLiteDatabase中提供了一个update()方法用于对数据进行更新。这个方法有四个参数:
第一个参数:表名 第二个参数:ContentValues对象,吧要更新的数据组装进去 第三、第四个参数:用于去约束更新某一行或某几行中的数据,不指定的话默认就是更新所有
现在来修改一下代码。
activity_main.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" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/add_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="添加数据"/> <Button android:id="@+id/update_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="更新数据"/> </LinearLayout>
添加了一个用于更新的按钮。
MainActivity.java 代码
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper; SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //帮助类对象 myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,4); //先获取到SQLiteDatabase对象 db = myDatabaseHelper.getWritableDatabase();//创建数据库 //添加数据的代码省略。。。 //修改数据 Button updateData = findViewById(R.id.update_daea); updateData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //方法一:Android方法更新数据 ContentValues values = new ContentValues(); values.put("price",15); db .update("Book",values,"name =?",new String[]{"天空不要为我掉眼泪"}); //方法二:SQL语句更新数据 //db.execSQL("update Book set price= ? where name =?",new String[] {"15","天空不要为我掉眼泪"}); } }); } }
我们更新按钮的点击事件中,创建了一个ContentValues 对象,并且给他指定了一组数据,修改这组数据中的价格字段,修改为15。可以看到,update()方法中的第三个参数对应着SQL语句中where部分,?表示占位符。第四个参数是第三个参数中每个占位符对应的数据。我这里的意思就是把书名伪天空不要为我掉眼泪这本书的价格改为15.
然后我们运行一下程序,看一下效果。
删除数据
SQLiteDatabase中提供了一个delete()方法用于删除数据。
activity_main.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" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/add_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="添加数据"/> <Button android:id="@+id/update_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="更新数据"/> <Button android:id="@+id/delete_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="删除数据"/> </LinearLayout>
MainActivity.java 代码
public class MainActivity extends AppCompatActivity { private MyDatabaseHelper myDatabaseHelper; SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //帮助类对象 myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,4); //先获取到SQLiteDatabase对象 db = myDatabaseHelper.getWritableDatabase();//创建数据库 //添加数据的代码省略。。。 //修改数据代码省略。。。。 //删除数据 Button deleteData = findViewById(R.id.delete_daea); deleteData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //方法一:用Android方法删除数据 db.delete("Book","price >?",new String[]{"25"}); //方法二:用SQL语句删除数据 //db.execSQL("delete from Book where price >?",new String[] {"25"}); } }); } }
在删除按钮的点击事件中,我们指明了去删除book表中的数据,把价格超过25元的删除掉。然后重新运行一下程序。
我们看到数据中只剩下了一条数据,并且价格小于25.所以我们删除成功了。
查询数据
SQLiteDatabase中提供了一个query()方法用于对数据进行查询,这个方法一个用7个参数,我们来看一下它的含义。
第一个参数:表名 第二个参数:指定去查那几列,不指定则默认查询所有列 第三、四个参数:用于去约束查询某一行或某几行的数据,不指定则默认是查询所有行 第五个参数:用于指定需要去group by的列,不指定则表示不对查询结果进行group by操作 第六个参数:用于对group by之后的数据进行进一步的过滤,不指定则表示不进行过滤 第七个参数:用于指定查询结果的排序方式,不指定则表示使用默认的排序方法
下图可以参考一下:
我们来看下代码吧,
activity_main.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" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/add_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="添加数据"/> <Button android:id="@+id/update_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="更新数据"/> <Button android:id="@+id/delete_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="删除数据"/> <Button android:id="@+id/query_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="查询数据"/> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
这里我们创建了一个用于查询的按钮,一个用于查看数据的TextView。
MainActivity.java 代码
public class MainActivity extends AppCompatActivity { private MyDatabaseHelper myDatabaseHelper; SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //帮助类对象 myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,4); //先获取到SQLiteDatabase对象 db = myDatabaseHelper.getWritableDatabase();//创建数据库 //添加数据的代码省略。。。 //修改数据代码省略。。。。 //删除数据代码省略 //查询所有数据 Button queryData = findViewById(R.id.query_daea); queryData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //查询BOOK表中所有数据 Cursor cursor = db.query("Book",null,null,null,null,null,null); String data = ""; while (cursor.moveToNext()){ //遍历cursor对象,取出数据并打印 String name = cursor.getString(cursor.getColumnIndex("name")); String author = cursor.getString(cursor.getColumnIndex("author")); int pages = cursor.getInt(cursor.getColumnIndex("pages")); double price = cursor.getDouble(cursor.getColumnIndex("price")); data = data +"\n"+ " "+name + " "+author+" "+pages+" "+price; } TextView textView = findViewById(R.id.text); textView.setText(data); cursor.close(); } }); } }
这里调用了moveToNext()来将数据的指针移动到第一行的位置,然后去循环遍历查询到的每一行数据。在循环中通过Cursor的getColumnIndex()方法获取到某一列在表中对应的位置索引,然后再将这个索引传入到相应的取值方法中,就可以读到数据库中的数据。我们用TextView把数据显示出来。最后不要忘了关闭Cursor.
然后我们运行下程序,看一下效果:
使用SQL操作数据库
前面的代码中,我有写,这里就简单的归类一下。
添加数据: db.execSQL("insert into Book(name,author,pages,price)values(?,?,?,?)",new String[]{"恶意","东野圭吾","300","28.88"}); 更新数据: db.execSQL("update Book set price= ? where name =?",new String[] {"15","天空不要为我掉眼泪"}); 删除数据: db.execSQL("delete from Book where price >?",new String[] {"25"}); 查询数据: db.rawQuery("selete * from Book",null); //这里是调用SQLiteDatabase的rawQuery()方法
使用事务
SQLite数据库是支持事务的,事务的特性可以保证某一系列的操作要么全部完成,要么一个都不会完成。
我们来看下如何在Android中使用事务。如果我们要删除掉book表中的数据,替换成新的数据。可以先用delete删除数据,在用insert将新数据添加进去,我们必须保证删除数据和添加数据必须一起完成,否则就还要继续保存原来的数据。
activity_main.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" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/add_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="添加数据"/> <Button android:id="@+id/update_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="更新数据"/> <Button android:id="@+id/delete_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="删除数据"/> <Button android:id="@+id/query_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="查询数据"/> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/replace_daea" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#F0FFFF" android:text="替换数据"/> </LinearLayout>
这里我们又添加了一个用于替换数据的按钮。
MainActivity.java代码
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper; SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //帮助类对象 myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,4); //先获取到SQLiteDatabase对象 db = myDatabaseHelper.getWritableDatabase();//创建数据库 //添加数据的代码省略。。。 //修改数据代码省略。。。。 //删除数据代码省略 //查询所有数据 Button queryData = findViewById(R.id.query_daea); queryData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //查询BOOK表中所有数据 Cursor cursor = db.query("Book",null,null,null,null,null,null); String data = ""; while (cursor.moveToNext()){ //遍历cursor对象,取出数据并打印 String name = cursor.getString(cursor.getColumnIndex("name")); String author = cursor.getString(cursor.getColumnIndex("author")); int pages = cursor.getInt(cursor.getColumnIndex("pages")); double price = cursor.getDouble(cursor.getColumnIndex("price")); data = data +"\n"+ " "+name + " "+author+" "+pages+" "+price; } TextView textView = findViewById(R.id.text); textView.setText(data); cursor.close(); } }); //替换数据 Button btn_replace = findViewById(R.id.replace_daea); btn_replace.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { db.beginTransaction();//开启事务 try{ db.delete("Book",null,null); if(true){ //手动抛出一个异常,让事务失败 throw new NullPointerException(); //第二次执行的时候,把这句代码注释掉 } db.execSQL("insert into Book(name,author,pages,price)values(?,?,?,?)",new String[]{"恶意","东野圭吾","300","28.88"}); db.setTransactionSuccessful();//事务已经执行成功 Toast.makeText(MainActivity.this,"替换成功!",Toast.LENGTH_SHORT).show(); }catch (Exception e){ e.printStackTrace(); }finally { db.endTransaction();//结束事务 } } }); } }
我们先开启一个事务beginTransaction(),然后在一个异常捕获的代码块中去执行具体的数据库操作,但所有操作完成后调用setTransactionSuccessful()表示事务已经执行成功,最后在finally中调用endTransaction()结束事务。这里注意,我们在删除代码执行完后手动抛出了一个异常,导致事务失败,就不会执行添加数据的操作,而事务的失败,表示删除数据的操作也不会执行。
然后我们去运行一下程序,第一次操作时,不会有任何效果,因为我们手动抛出了一个异常,让事务失败了。
我们把手动抛出异常的那一行代码删除或注释掉,再重新运行一下程序。然后就会发现数据已经被替换成新数据了。
升级数据库的最佳写法
我们前面使用的升级数据库方法有些粗暴,为了保证数据库中的所有表都是最新的,我们只是在onUpgrade()方法中删除掉当前所有表,然后再重新调用onCreate()方法创建表。而这样子的弊端也出来了,我们在删除表的同时,也把表的数据给删除了。如果是一个程序的话,就相当于删除了你的用户资料,你的用户也会大量流失。
MyDatabaseHelper.java代码
public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table book(" + "id integer primary key autoincrement," + "author text," + "price real," + "pages integer," + "name text," + "category_id integer)"; public static final String CREATE_CATEGORY = "create table Category(" + "id integer primary key autoincrement," + "category_name text," + "category_code integer)"; private Context mcontext; public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mcontext = context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY); Toast.makeText(mcontext,"创建成功",Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //选择版本号 switch (oldVersion){ case 1: db.execSQL(CREATE_CATEGORY); case 2: db.execSQL("alter table Book add column category_id integer"); default: } } }
我们在onUpgrade()方法中添加了一个switch判断,
如果用户当前版本号为1 ,就只创建一个Category表,如果用户是直接安装第二版本时,就会将两张表一起创建。而当用户是使用第二版本覆盖第一版本时,就会到进入升级数据库的操作,此时因为book已经存在了,就只需要创建一个Category表。
如果用户当前版本号为2 ,就会执行alter命令,在book表中新增一个 category_id 列。
我们这里要注意一点,这里的switch没有加break,是保证你在跨版本升级时,每一次的数据库修改都能被全部执行到。使用这种方式来维护数据库的升级,不管版本怎么样更新,都可以保证数据库的表结构是最新的,而且表中的数据也完全不会丢失。
这漫长的SQLite内容就没了。此时此刻我们应该进入漫长的休息中!
- Android SQLite 数据库创建,增删改查,升级数据库,SD卡中的数据库操作,多表查询操作
- sqlite数据库的基本操作基于FMDatabase(创建数据库,创建表,对标进行增,删,改,查)
- Android数据存储之SQLite数据库存储,数据库的CRUD操作(增、查、改、删)(创建BookStore.db数据库,创建Book表,并了解adb shell来查看数据库和表的创建情况)
- Android 存储学习之SQLite数据库的基本操作 (使用API操作数据库)
- IOS 之使用FMDB进行SQLite数据库操作——表的创建与修改,以及数据的增删改查和多线程操作数据库
- 【SQLite数据库存储】创建、升级数据库
- Android数据存储————SQLite数据库创建及增删改查操作
- SQL Server 数据库基本操作——创建修改数据库
- 【Android基础篇】SQLite数据库的增删改查基本操作
- Android通讯录数据库介绍与基本操作(增删改查)
- 2. MongoDB基本操作 —— 用Mongo.exe操作数据库增删改查
- MYSQL基本操作--登陆退出,数据库、表、字段的创建、查看、删除、更改
- SQL2K数据库开发二十七之存储过程操作创建存储过程(二)
- mysql 数据库基本的增删改查操作
- C# 用Linq的方式实现对Xml文件的基本操作(创建xml文件、增删改查xml文件节点信息)
- Hive学习(一)-表及数据库的创建删除基本操作
- 分享一段ios数据库代码,包括对表的创建、升级、增删查改
- SQL2K数据库开发二十六之存储过程操作创建存储过程(一)
- android下数据库的创建和增删改查操作
- SQL2K数据库开发二十七之存储过程操作创建存储过程(二)