首先我们要知道SQLiteOpenHelper是一个抽象类,这意味着如果我们要使用它的话,就需要创建一个自己的帮助类去继承它,SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建,升级数据库的逻辑。
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button mButtonCreateDB;
private Button mButtonInsert;
private SQLiteDatabase db;//创建SQLiteDatabase对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//对SQLiteOpenHelper进行实例化以后,在调用它的getReadableDatabase()或getWritableDatabase()方法来创建数据库
SQLiteOpenHelper helper=new SQLiteOpenHelper(getApplicationContext(),"My_First_DB1.db");//创建的My_First_DB1.db数据库文件会存放在/data/data/《packsge name》/database/目录下
db=helper.getWritableDatabase();
mButtonCreateDB= (Button) findViewById(R.id.button_db);
mButtonCreateDB.setOnClickListener(this);
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button_db:
Toast.makeText(MainActivity.this, "创建了数据库", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
public class SQLiteOpenHelper extends android.database.sqlite.SQLiteOpenHelper {
//参数Context必须要有它才能对数据库进行操作,第二个参数是数据库名,创建数据库时使用的就是这里指定的名称,第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null,第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。
public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public SQLiteOpenHelper(Context context, String name){
this(context,name,null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists user(id integer not null primary key autoincrement,name varchar(20),password varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
<Button
android:id="@+id/button_db"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="创建数据库"/>
case R.id.button_insert:
ContentValues value=new ContentValues();
value.put("name","zhangsan");
value.put("password","123456");
db.insert("user",null,value);
//如果要插入多条数据,在插入第一条数据完成后,需要用到value.clear();然后在组装第二条要插入的数据。
// value.put("name","lisi");
// value.put("password","123");
//db.insert("user",null,value);
break;
SQLiteDatabase中提供了一个insert()方法,专门用于添加数据,它接收三个参数,第一个参数是表名,第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值null,第三个参数是一个ContentValues对象,它提供了一系列的put()方法重载,用于向ContentValues中添加数据,只需要将表中的每个列名以及相应的待添加数据传入即可。
case R.id.button_update:
ContentValues values=new ContentValues();
values.put("password", "abcdef");
//第三个参数对应的是SQL语句的where部分,表示去更新所有name等于?的行,而?是一个占位符,可以通过第四个参数提供的一个字符串数组为第三个参数中的每个占位符指定相应的内容。
//将名字是zhangsan的密码改为acdef
db.update("user",values,"name=?",new String []{"zhangsan"});
break;
SQLiteDatabase中提供了一个update()方法用于对数据进行更新这个方法接收四个参数,第一个是表名,第二个参数是ContentValues对象,把更新数据在这里组装进去,,第三个、四个参数是用来约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行。
case R.id.button_delete:
//删除名为zhangsan的这一条数据
db.delete("user","name=?",new String []{"zhangsan"});
Toast.makeText(MainActivity.this, "删除了名称是张三的数据", Toast.LENGTH_SHORT).show();
break;
和更新数据是类似的用法。
case R.id.button_select:
Cursor cursor=db.query("user",null,null,null,null,null,"id desc","3 ,4");//4是用来分页显示的(倒序的时候除去前四个)
// Cursor cursor=db.rawQuery("select * from user",null);
cursor.moveToFirst();
while(!cursor.isAfterLast()){
String name=cursor.getString(cursor.getColumnIndex("name"));
String password=cursor.getString(cursor.getColumnIndex("password"));
Log.d("cursor","用户名"+name+"密码"+password);
cursor.moveToNext();
}
break;
虽然query()方法的参数非常多,但是多数情况下值需要传入少数的几个参数就可以完成查询操作了,调用query()方法后会返回一个Cursor对象,查询到的 所有的数据都将从这个对象中取出。
query()方法参数 | 对应SQL部分 | 描述 |
---|---|---|
table | from table_name | 指定查询的表名 |
columns | select column1,colomn2 | 指定查询的列表 |
selection | where column=value | 指定where的约束条件 |
selectionArgs | - | 为where中占位符提供具体的值 |
groupBy | group by column | 指定需要group by 的列 |
having | having column=value | 对group by 后的结果进一步进行约束 |
orderBy | order by column1,column2 | 指定查询结果的排序方式 |
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button mButtonCreateDB;
private Button mButtonInsert;
private SQLiteDatabase db;
private Button mButtonUpdate;
private Button mButtonDelete;
private Button mButtonSelect;
private EditText mEditTextUsername;
private EditText mEditTextPassword;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SQLiteOpenHelper helper=new SQLiteOpenHelper(getApplicationContext(),"My_First_DB1.db");
db=helper.getWritableDatabase();
mButtonCreateDB= (Button) findViewById(R.id.button_db);
mButtonCreateDB.setOnClickListener(this);
mButtonInsert= (Button) findViewById(R.id.button_insert);
mButtonInsert.setOnClickListener(this);
mButtonUpdate= (Button) findViewById(R.id.button_update);
mButtonUpdate.setOnClickListener(this);
mButtonDelete= (Button) findViewById(R.id.button_delete);
mButtonDelete.setOnClickListener(this);
mButtonSelect= (Button) findViewById(R.id.button_select);
mButtonSelect.setOnClickListener(this);
mEditTextUsername= (EditText) findViewById(R.id.edittext_username);
mEditTextUsername.setOnClickListener(this);
mEditTextPassword= (EditText) findViewById(R.id.edittext_password);
mEditTextPassword.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button_db:
//必须调用getWritableDatabase()方法,为了调用到TestSQLiteOpenHelper里面的方法
Toast.makeText(MainActivity.this, "创建了数据库", Toast.LENGTH_SHORT).show();
break;
case R.id.button_insert:
// ContentValues value=new ContentValues();
// value.put("name","zhangsan");
// value.put("password","123456");
// db.insert("user",null,value);
ContentValues value=new ContentValues();
//得到从屏幕上输入的数据;
value.put("name",mEditTextUsername.getText().toString());
value.put("password",mEditTextPassword.getText().toString());
db.insert("user",null,value);
break;
case R.id.button_update:
ContentValues values=new ContentValues();
values.put("password", "abcdef");
db.update("user",values,"name=?",new String []{"zhangsan"});
break;
case R.id.button_delete:
db.delete("user","name=?",new String []{"zhangsan"});
Toast.makeText(MainActivity.this, "删除了名称是张三的数据", Toast.LENGTH_SHORT).show();
break;
case R.id.button_select:
Cursor cursor=db.query("user",null,null,null,null,null,"id desc","3 ,4");//4是用来分页显示的(倒序的时候出去前四个)
// Cursor cursor=db.rawQuery("select * from user",null);
cursor.moveToFirst();
while(!cursor.isAfterLast()){
String name=cursor.getString(cursor.getColumnIndex("name"));
String password=cursor.getString(cursor.getColumnIndex("password"));
Log.d("cursor","用户名"+name+"密码"+password);
cursor.moveToNext();
}
break;
default:
break;
}
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<EditText
android:id="@+id/edittext_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名"/>
<EditText
android:id="@+id/edittext_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码"/>
<Button
android:id="@+id/button_db"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="创建数据库"/>
<Button
android:id="@+id/button_insert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="插入数据"/>
<Button
android:id="@+id/button_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改数据"/>
<Button
android:id="@+id/button_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除数据"/>
<Button
android:id="@+id/button_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询数据"/>
</LinearLayout>