在前面,我已经讲了,sqlite的创建具体过程android sqlite轻量级数据库的基本运用之创建数据库 ,现在就来学习一下sqlite是如何进行数据存储并且像其他数据库那样实现增删改查的
相信并不是每个人都非常的熟悉sql语句,所以android也向我们对数据库的增删改查提供了一系列的辅助方法,使不懂sql语句的开发者也能对sqlite进行增删改查
现在就让我们来创建一个数据库,使的这个数据库包含了一张book的表单
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
/**
* Created by blue on 2016/7/15.
*/
public class MyDataBase extends SQLiteOpenHelper {
public static final String sqlStatements = "create table book ("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";
private Context context;
public MyDataBase(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(sqlStatements);
Toast.makeText(context,"数据库创建成功",Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyDataBase dataBase = new MyDataBase(this,"BookManager.db",null,1);
dataBase.getWritableDatabase();
}
}
这两段代码就创建出了一个有book表单的数据库了,关于这个两段代码请 点击进入详解参考我写的这篇博客
好了现在数据库和表单已经创建出来了,现在就让我们开始想表单中添加数据了
在我们向表中添加数据之前我们需要了解SQLiteOpenHelper的 getReadableDatabase()或 getWritableDatabase()这两个方法,就像人如其名这个成语一样,看这两个方法名字,我们就已经能猜出他们的大概作用的了,没错就是这两个方法这两个方法都会返回一个SQLiteDatabase对象,借助这个对象就可以对数据进行 增删改查 操作了
并且我们还得了解一下SQLiteDatabase为我们提供的insert方法,由名字可以知道,这个方法是用来添加数据的,这个方法他接收三个参数,第一个就是我们表单的名字,第二个就是用于在未指定添加数据情况下给某些可为空的列自动赋值 NULL, 一般我们用不到这个功能, 直接传入 null 即可,然后第三个数据就是一个ContentValues对象了,ContentValues是一种存储机制,他只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,并且像里面存储的是键值对,现在我们就来编写代码:
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button btn_add;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_add = (Button) findViewById(R.id.btn_start);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyDataBase dataBase = new MyDataBase(MainActivity.this,"BookManager.db",null,1);
ContentValues values = new ContentValues();
values.put("name","The Firs Line Code");
values.put("author","guolindashen");
values.put("price",21.22);
values.put("pages",666);
SQLiteDatabase db = dataBase.getWritableDatabase();
db.insert("book",null,values);
Toast.makeText(MainActivity.this,"数据添加成功",Toast.LENGTH_SHORT).show();
}
});
}
}
上面的这段代码 我们创建了一个ContentValues的对象 并且向这个对象中添加四组与表单中字段相匹配的键值对,然后我们调用SQLiteDatabase的insert函数把这个contenvalue传递进去,并且解析到了,数据库表中的四个字段,由于id我们设置的是自增长所以就不需要传入了
好了现在我们可以通过adb shell来进行查看一下我们数据是否真的添加去了,由于博主用的是小米真机进行调试 adb sehll 的sqlite命令无法使用 所以使用sqlite editor 的应用来查看我们的数据库
由于我多启动了几次 所以结果就像这样了,但数据我们确实是存进去了
好了现在数据库的增加数据已经 完成了 我们来完成数据库表单中字段的删除
首先我们要了SQLiteDatabase 中提供了一个 delete()方法专门用于删除数据,这个方法接收三个参数,第一个参数仍然是表名,这个已经没什么好说的了,第二、第三个参数又是用于去约束删除某一行或某几行的数据,不指定的话默认就是删除所有行。
现在让我们来编写代码
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button btn_add;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_add = (Button) findViewById(R.id.btn_start);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyDataBase dataBase = new MyDataBase(MainActivity.this,"BookManager.db",null,1);
SQLiteDatabase db = dataBase.getWritableDatabase();
db.delete("Book", "pages > ?", new String[] { "500" });
}
});
}
}
从上面可以看出,我们调用delet方法 ,删除那些页数超过 500 页的书籍
现在让我们启动程序,可以看出 我们把所有的书都删除了,因为我们所添加的书籍的页面都是大于500的
好了删除已经完成,接下来就是修改了,由于刚才删除已经把表单的书籍全都删除完了,我们重新运行一下增加的程序,然后我们将对这本书进行修改
修改又叫更新,SQLiteDatabase 中也是提供了一个非常好用的 update()方法用于对数据进行更新,这个方法接收四个参数,第一个参数和 insert()方法一样,也是表名第二个参数是 ContentValues 对象,要把更新数据在这里组装进去。第三、第四个参数用于去约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行。
现在让我们来写代码
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button btn_add;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_add = (Button) findViewById(R.id.btn_start);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyDataBase dataBase = new MyDataBase(MainActivity.this,"BookManager.db",null,1);
SQLiteDatabase db = dataBase.getWritableDatabase();
dataBase.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price", 10.99);
db.update("Book", values, "name = ?", new String[] { "The First Line Code" });
Toast.makeText(MainActivity.this,"数据更新成功",Toast.LENGTH_SHORT).show();
}
});
}
}
可以看到我们把21.22 改成了 10.99
增删改已经完成了,现在我们来完成最后的 查询
在写查询语句的时候我们按照惯例还是要了解一下,,SQLiteDatabase中还提供了一个query()方法用于对数据进行查询。这个方法的参数非常复杂,最短的一个方法重载也需要传入七个参数。那我们就先来看一下这七个参数各自的含义吧,第一个参数不用说,当然还是表名,表示我们希望从哪张表中查询数据。第二个参数用于指定去查询哪几列,如果不指定则默认查询所有列。第三、第四个参数用于去约束查询某一行或某几行的数据,不指定则默认是查询所有行的数据。第五个参数用于指定需要去 group by 的列,不指定则表示不对查询结果进行 group by 操作。第六个参数用于对 group by 之后的数据进行进一步的过滤,不指定则表示不进行过滤。第七个参数用于指定查询结果的排序方式,不指定则表示使用默认的排序方式。
当我们调用由于query方法时会返回一个Curso对象,query方法实在是太麻烦了 在这里我们只写一个简单查询表中所有数据的语句
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button btn_add;
private TextView text_data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_add = (Button) findViewById(R.id.btn_start);
text_data = (TextView) findViewById(R.id.text_data);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyDataBase dataBase = new MyDataBase(MainActivity.this,"BookManager.db",null,1);
SQLiteDatabase db = dataBase.getWritableDatabase();
Cursor cursor = db.query("Book", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
// 遍历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"));
text_data.setText(name+"\n"+author+"\n"+pages+"\n"+price);
} while (cursor.moveToNext());
}
cursor.close();
}
});
}
}
从上面代码我们可以看出使用了第一个参数指明去查询 Book 表,后面的参数全部为 null。这就表示希望查询这张表中的所有数据,虽然这张表中目前只剩下一条数据了。 查询完之后就得到了一个 Cursor 对象, 接着我们调用它的 moveToFirst()方法将数据的指针移动到第一行的位置,然后进入了一个循环当中,去遍历查询到的每一行数据。在这个循环中可以通过 Cursor 的 getColumnIndex()方法获取到某一列在表中对应的位置索引,然后将这个索引传入到相应的取值方法中,就可以得到从数据库中读取到的数据了,然后我们将取出来的数据放在了TextView中
到现在为止我们已经学会了基本增删改查了
参考资料 第一行代码