Android中数据库的一些操作(增删改查)

提起Android的开发,就不得不提数据库,几乎每个App中都会用到Sqlit数据库存储一些数据,小编闲暇时期,写了一个小demo关于数据库的增删改查,之前也介绍过数据库的一个开源框架ORMLite,在这里主要用到的是Android自带的一些空间和属性来实现的,话不多少,直接上代码吧:

1、数据库的创建:

private static final String TABLENAME = "student";
private static final String CREATETABLE = "CREATE TABLE " + TABLENAME +
        "(_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,age INTEGER)";
public void creatTable(View view){
    /**
     * 创建数据库
     * 参数一:数据库名
     * 参数二:模式,一般为MOE_PRIVATE
     * 参数三:游标工厂对象,一般写null,表示系统自动提供
     */
    SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
    db.execSQL(CREATETABLE);
    db.close();
}
2、数据库表的创建和数据的添加:

public void insertData(View view){
    SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
    ContentValues values = new ContentValues();
    values.put("name","张三");
    values.put("age",18);
    /**
     *插入数据
     * 参数一:要插入的表名
     * 参数二:要插入的空数据所在的行数,第三个参数部位空,则此参数为null
     * 参数三:要插入的数据
     */
    db.insert(TABLENAME,null,values);
    ContentValues values1 = new ContentValues();
    values1.put("name","李四");
    values1.put("age",21);
    db.insert(TABLENAME,null,values1);
    db.close();
}
数据添加后的数据库结构:


3、数据库的更新:

public void updateData(View view){
    SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
    ContentValues values = new ContentValues();
    values.put("name","赵四");
    values.put("age",43);
    /**
     * 数据的更新
     * 参数一:要更新的数据所在的表名
     * 参数二:新的数据
     * 参数三:要更新数据的查找条件
     * 参数四:条件的参数
     */
    db.update(TABLENAME,values,"_id=?",new String []{"2"});
    db.close();
}
数据更新后:


4、数据的查找:

public void queryData(View view){
    SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
    //查询部分数据
    Cursor cursor = db.rawQuery("select * from " + TABLENAME + "where name=?",new String []{"张三"});
    //查询全部数据
    Cursor cursor1 = db.rawQuery("select * from " + TABLENAME ,null);
    //将游标移到第一行
    cursor1.moveToFirst();
    //循环读取数据
    while(!cursor1.isAfterLast()){
        //获得当前行的标签
        int nameIndex = cursor1.getColumnIndex("name");
        //获得对应的数据
        String name = cursor1.getString(nameIndex);
        int ageIndex = cursor1.getColumnIndex("age");
        int age = cursor1.getInt(ageIndex);
        Log.d(TAG, "name:"+ name +"age: "+age);
        //游标移到下一行
        cursor1.moveToNext();
    }
    db.close();
}
查询的结果:


5、数据的删除:

public void delectData(View view){
    SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
    //要删除的数据
    db.delete(TABLENAME,"name = ?",new String[]{"赵四"});
    db.close();
}
数据删除后:



SqliteOpenHelper的用法:
该类的方法:

1getReadableDatabase() 创建或者打开一个可读写的数据库,如果出现问题(磁盘满等),则打开一个只读的数据库。

2getWritableDatabase() 获得一个可读写的数据库。如果磁盘满则会抛异常。

3onCreate(SQLiteDatabase db) 只有第一次创建这个数据库的时候调用。一般在这个方法中创建数据的相应表。

4onOpen(SQLiteDatabase db) 当每次打开数据库的时候都会调用。这个方法很少使用

5onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) 当升级数据库即数据库的版本号发生改变的时候调用,一般如果需要修改表结构就写在这里.

//db.execSQL(“alert 表名 add 列名列数据类型”);

6 close()    关闭打开的所有数据库对象

使用步骤:
  1. 创建SQLiteOpenHelper类的子类MySQLiteOpenHelper 类,实现SQLiteOpenHelper类中的抽象方法onCreate()onUpgrade()
  2. 调用 MySQLiteOpenHelper 对象的getWritableDatabase  getReadableDatabase方法,获得SQLiteDatabase 对象;
  3. 创建表。
  4. 调用SQLiteDatabase 对象的execSQL()方法,执行 updateinsertdelete操作;调用rawQuery()方法执行select查询操作;
  5. 如果执行的是查询操作,则对返回的Cursor进一步处理。
示列:
    布局:
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/button"/>
    <Button
    android:id="@+id/button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="添加数据"
    android:onClick="btnClick"/>

    </RelativeLayout>
    菜单Menu:
    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >

    <item
    android:id="@+id/insert_item"
    app:showAsAction="never"
    android:title="插入数据"/>

    <item
    android:id="@+id/delete_item"
    app:showAsAction="never"
    android:title="删除数据"/>
    <item
    android:id="@+id/update_item"
    app:showAsAction="never"
    android:title="修改数据"/>
    </menu>
    Student实例:
    public class StudentEntity {

    private String name;
    private Integer age;

    public StudentEntity() {
    }

    public StudentEntity(String name, Integer age) {
    this.name = name;
    this.age = age;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public Integer getAge() {
    return age;
    }

    public void setAge(Integer age) {
    this.age = age;
    }

    @Override
    public String toString() {
    return "StudentEntity{" +
    "name='" + name + '\'' +
    ", age=" + age +
    '}';
    }
    }
    SQLiteOpenHelper 类的子类:
    public class MyOpenHlper extends SQLiteOpenHelper{

    private static final String TABALENAME = "student";
    private static final String CREATETABLE = "CREATE TABLE " + TABALENAME
    + "(_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT, age INTEGER)";
    //构造方法,系统会自动创建数据库文件
    public MyOpenHlper(Context context,String name,int version){
    super(context,name,null,version);
    }
    //只有在第一次打开数据库的时候调用
    @Override
    public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATETABLE);
    }


    //当数据库的版本发生变化的时候调用
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //更新表结构或删除旧的表结构
    db.execSQL("DROP TABLE IF EXISTS "+TABALENAME);
    onCreate(db);
    }
    }
    主函数:
    public class MySqlite extends MainActivity{

    private static final String TABALENAME = "student";
    private ListView mListView;
    private List<StudentEntity> mList;
    private MyOpenHlper myOpenHlper;
    private SQLiteDatabase db;
    private Cursor mCursor;
    private SimpleCursorAdapter adapter;
    private int index = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mysqlite);
    init();
    downLoadData();
    }

    public void init(){
    mListView = (ListView) findViewById(R.id.listView);
    mList = new ArrayList<>();
    myOpenHlper = new MyOpenHlper(this,"test.db",2);
    db = myOpenHlper.getWritableDatabase();
    mCursor = db.rawQuery("select * from "+TABALENAME,null);
    adapter = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_2, mCursor,
    new String[]{"name","age"},
    new int[]{android.R.id.text1,android.R.id.text2},
    SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
    mListView.setAdapter(adapter);
    }
    public void downLoadData(){
    mList.add(new StudentEntity("张三",12));
    mList.add(new StudentEntity("李四",15));
    mList.add(new StudentEntity("王五",18));
    mList.add(new StudentEntity("赵六",22));
    mList.add(new StudentEntity("麻子", 25));
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main,menu);
    return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if(id == R.id.insert_item){
    if(index<mList.size()){
    ContentValues values = new ContentValues();
    values.put("name",mList.get(index).getName());
    values.put("age",mList.get(index).getAge());
    db.insert(TABALENAME,null,values);
    mCursor = db.rawQuery("select * from "+TABALENAME,null);
    adapter.swapCursor(mCursor);
    index++;
    }
    }
    return true;
    }

    /* public void btnClick(View view){

    if(index<mList.size()){
    ContentValues values = new ContentValues();
    values.put("name",mList.get(index).getName());
    values.put("age",mList.get(index).getAge());
    db.insert(TABALENAME,null,values);
    mCursor = db.rawQuery("select * from "+TABALENAME,null);
    adapter.swapCursor(mCursor);
    index++;
    }
    }*/
    }
    其中:SimpleCursorAdapter是CursorAdapter的子类,
    使用方式与 SimpleAdapter 类似

    原型:

    new SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to , int flags) ;

    参数:

    1)、Context context, 这个与 SimpleListItemFactory 相关的 ListView 所处运行上下文(context)。也就是这个 ListView 所在的 Activity

     

    2)、int layout, 显示 list item 的 布局文件。这个 layout 文件中至少要包含在 "to" 参数中命名的 views

     

    3)、Cursor c, 数据库的光标( Cursor )。如果 cursor 无效,则该参数可以为 null

     

    4)、String[] from, 指定 column 中的哪些列的数据将绑定(显示)到 UI 中。如果 cursor 无效, 则该参数可为 null

     

    5)、int[] to, 指定用于显示 "from" 参数指定的数据列表的 views。 这些 views 必须都是 TextViews "from" 参数的前 N 个值(valus)和 "to" 参数的前 N  views 是一一对应的关系。如果 cursor 无效,则该参数可为 null

     

    6)、flags,用于定义适配器行为的标志位

    Flags used to determine the behavior of the adapter; may be any combination of FLAG_AUTO_REQUERY and FLAG_REGISTER_CONTENT_OBSERVER

     

     FLAG_AUTO_REQUERY(常量值:)从 API11 开始已经废弃。因为他会在应用程序的 UI 线程中执行Cursor查询操作, 导致响应缓慢甚至应用程序停止响应(ANR)application not response的错误。作为替代方案,请使用 LoaderManager  CursorLoader

    如果设置FLAG_REGISTER_CONTENT_OBSERVER(常量值:2),适配器会在Cursor上注册一个Observer,当通知到达时会调用 onContentChanged() 方法。

    效果图:

    • 14
      点赞
    • 79
      收藏
      觉得还不错? 一键收藏
    • 4
      评论
    评论 4
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值