Android储存---SQLite数据库的简单使用,实现增删改查

版权声明:转载请注明出处 https://blog.csdn.net/dl10210950/article/details/52549398

demo效果

增加数据:       

删除数据 修改数据


SQLite介绍

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
------(摘自百度百科)

SQLite数据类型


一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:
NULL: 这个值为空值;
VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000;
CHAR(n):长度固定为n的字串,n不能超过 254;
INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8;
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号;
TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE);
BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改  变格式;
DATA :包含了 年份、月份、日期;

TIME: 包含了 小时、分钟、秒;

SQLite常用的方法

方法名称
方法表示含义
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory  factory)     创建数据库
打开或创建数据库
insert(String table,String nullColumnHack,ContentValues  values)插入数据
插入一条记录
delete(String table,String whereClause,String[]  whereArgs)删除数据
删除一条记录
query(String table,String[] columns,String selection,String[]  selectionArgs,String groupBy,String having,String  orderBy)   查找数据
查询一条记录
update(String table,ContentValues values,String whereClause,String[]  whereArgs)     更新数据
修改记录
execSQL(String sql)
执行一条SQL语句
close()     关闭数据

insert插入数据

insert(String table,String nullColumnHack,ContentValues  values)
传入的参数:1,表名,2,空列的默认值,3,ContentValues,类似于hashMap,是一种储存的机制,用法为:
/**
     * 创建一个用来插入数据的方法
     *
     * @param name  姓名
     * @param sex   性别
     * @param age   年龄
     * @param hobby 爱好
     */
    public void insert(String name, String sex, String age, String hobby) {
        //让数据库可写
        SQLiteDatabase database = getWritableDatabase();
        /*
        类似于HashMap 都有键值对
        key 对应的列表中的某一列的名称,字段
        value 对应字段要插入的值
         */
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("sex", sex);
        values.put("age", age);
        values.put("hobby", hobby);
        //插入
        database.insert(TABLE_NAME, null, values);
        //插入完成后关闭,以免造成内存泄漏
        database.close();

    }

delete删除数据

delete(String table,String whereClause,String[]  whereArgs)
传入的参数:参数1, 表名称   参数2 , 删除条件参数3 , 删除条件值数组,用法为:
/**
     * 创建一个删除数据的方法,传入的参数越多,删除时越精确的找到要删除的哪一行
     *
     * @param name
     * @param sex
     * @param age
     * @param hobby
     */
    public void delete(int id, String name, String sex, String age, String hobby) {
        SQLiteDatabase database = getWritableDatabase();
        /*
        删除的条件,当id = 传入的参数id时,sex = 传入的参数sex时,age = 传入的age,hobby = 传入的hobby时
        当条件都满足时才删除这行数据,一个条件不满足就删除失败
         */
        String where = "id=? and name = ? and sex = ? and age = ? and hobby = ?";
        //删除条件的参数
        String[] whereArgs = {id + "", name, sex, age, hobby};
        database.delete(TABLE_NAME, where, whereArgs);
        database.close();
    }

    /**
     * 再创建一个删除一个删除的方法,条件只有一个
     */
    public void delete(int id) {
        SQLiteDatabase database = getWritableDatabase();
        //当条件满足id = 传入的参数的时候,就删除那整行数据,有可能有好几行都满足这个条件,满足的全部都删除
        String where = "id = ?";
        String[] whereArgs = {id + ""};
        database.delete(TABLE_NAME, where, whereArgs);
        database.close();
    }


updata修改数据

update(String table,ContentValues values,String  whereClause, String[]  whereArgs)方法
传入的参数:参数1  表名称 参数2  跟行列ContentValues类型的键值对Key-Value
参数3  更新条件(where字句) 参数4  更新条件数组
/**
     * 创建一个修改数据的方法
     * @param id   条件,修改id为"id"的那一行数据
     * @param name
     * @param sex
     * @param age
     * @param hobby
     */
    public void updata(int id,String name, String sex, String age, String hobby) {
        SQLiteDatabase database = getWritableDatabase();
//        update(String table,ContentValues values,String  whereClause, String[]  whereArgs)
        String where = "id = ?";
        String[] whereArgs = {id+""};
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("sex", sex);
        values.put("age", age);
        values.put("hobby", hobby);
        //参数1  表名称	参数2  跟行列ContentValues类型的键值对Key-Value
       // 参数3  更新条件(where字句)	参数4  更新条件数组
        database.update(TABLE_NAME, values,where, whereArgs);
        database.close();

query查找数据

query(String table,String[] columns,String selection,String[]  selectionArgs,String groupBy,String having,String orderBy,String limit)
传入参数:参数table:表名称 参数columns:列名称数组 参数selection:条件字句,相当于where 参数selectionArgs:条件字句,参数数组
参数groupBy:分组列 参数having:分组条件 参数orderBy:排序列 参数limit:分页查询限制
  /**
     * 创建一个查找数据库的方法
     *
     * public  Cursor query(String table,String[] columns,String selection,String[]  selectionArgs,String groupBy,String having,String orderBy,String limit);
     各个参数的意义说明:
     参数table:表名称
     参数columns:列名称数组
     参数selection:条件字句,相当于where
     参数selectionArgs:条件字句,参数数组
     参数groupBy:分组列
     参数having:分组条件
     参数orderBy:排序列
     参数limit:分页查询限制
     参数Cursor:返回值,相当于结果集ResultSet
     Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
     */
    public Cursor query() {
        //数据库可读
        SQLiteDatabase database = getReadableDatabase();
        //查找
        Cursor query = database.query(TABLE_NAME, null, null, null, null, null, null);
        return query;
    }

循环遍历,拿到数据
 /**
     * 通过查找数据库,拿到里面的数据
     */
    private List<Map<String, Object>> getData() {
        list = new ArrayList<>();
        Cursor query = MyDataBase.getInstances(MainActivity.this).query();
        /*
        游标cursor默认是在-1的位置,query.moveToFirst()将游标移动到第一行,如果不写这个就会报
         Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 12
         这个问题坑爹,以后一定要注意
         */
        if (query.moveToFirst()) {
            do {
                String name = query.getString(query.getColumnIndex("name"));
                String sex = query.getString(query.getColumnIndex("sex"));
                String age = query.getString(query.getColumnIndex("age"));
                String hobby = query.getString(query.getColumnIndex("hobby"));
                int id = query.getInt(query.getColumnIndex("id"));
                Map<String, Object> map = new HashMap<>();
                map.put("id", id);
                map.put("name", name);
                map.put("sex", sex);
                map.put("age", age);
                map.put("hobby", hobby);
                list.add(map);
            } while (query.moveToNext());
        }
        //关闭查询游标
        query.close();
        return list;
    }

demo具体实现

操作数据库的类
package com.duanlian.databasedemo;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by duanlian on 2016/9/13.
 */
public class MyDataBase extends SQLiteOpenHelper {
    //数据库名字
    public static final String DB_NAME = "Students.db";
    //数据库版本
    public static final int DB_VERSION = 1;
    //表名
    public static final String TABLE_NAME = "student";
    public static MyDataBase myDataBase;

    /**
     * 单例模式返回数据库
     *
     * @param context 上下文
     * @return 数据库对象
     */
    public static MyDataBase getInstances(Context context) {
        if (myDataBase == null) {
            return new MyDataBase(context);
        } else {
            return myDataBase;
        }
    }


    //上下文,数据库名字,数据库工厂,版本号
    public MyDataBase(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    //此方法中创建表
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //这个有个坑,create table"+" " + TABLE_NAME 中间一定要加空格,别问为什么,我也不知道,不加就语法错误,吐血
        sqLiteDatabase.execSQL("create table" + " " + TABLE_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT,name text,sex text,age text,hobby text);");

    }

    /**
     * 用来更新数据库版本的
     * onCreate方法只是在第一次安装app的时候会调用,之后的数据库要更改的话,必须使用数据库版本上升,或者卸载了重新安装
     *
     * @param sqLiteDatabase 数据库
     * @param oldVersion     老的版本号
     * @param newVersion     更新后的版本号
     */
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        if (newVersion > oldVersion) {
            //删除老表
            sqLiteDatabase.execSQL("drop" + TABLE_NAME);
            //重新创建表
            onCreate(sqLiteDatabase);
        }

    }

    /**
     * 创建一个用来插入数据的方法
     *
     * @param name  姓名
     * @param sex   性别
     * @param age   年龄
     * @param hobby 爱好
     */
    public void insert(String name, String sex, String age, String hobby) {
        //让数据库可写
        SQLiteDatabase database = getWritableDatabase();
        /*
        类似于HashMap 都有键值对
        key 对应的列表中的某一列的名称,字段
        value 对应字段要插入的值
         */
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("sex", sex);
        values.put("age", age);
        values.put("hobby", hobby);
        //插入
        database.insert(TABLE_NAME, null, values);
        //插入完成后关闭,以免造成内存泄漏
        database.close();

    }


    /**
     * 创建一个查找数据库的方法
     *
     * public  Cursor query(String table,String[] columns,String selection,String[]  selectionArgs,String groupBy,String having,String orderBy,String limit);
     各个参数的意义说明:
     参数table:表名称
     参数columns:列名称数组
     参数selection:条件字句,相当于where
     参数selectionArgs:条件字句,参数数组
     参数groupBy:分组列
     参数having:分组条件
     参数orderBy:排序列
     参数limit:分页查询限制
     参数Cursor:返回值,相当于结果集ResultSet
     Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
     */
    public Cursor query() {
        //数据库可读
        SQLiteDatabase database = getReadableDatabase();
        //查找
        Cursor query = database.query(TABLE_NAME, null, null, null, null, null, null);
        return query;
    }

    /**
     * 创建一个删除数据的方法,传入的参数越多,删除时越精确的找到要删除的哪一行
     *
     * @param name
     * @param sex
     * @param age
     * @param hobby
     */
    public void delete(int id, String name, String sex, String age, String hobby) {
        SQLiteDatabase database = getWritableDatabase();
        /*
        删除的条件,当id = 传入的参数id时,sex = 传入的参数sex时,age = 传入的age,hobby = 传入的hobby时
        当条件都满足时才删除这行数据,一个条件不满足就删除失败
         */
        String where = "id=? and name = ? and sex = ? and age = ? and hobby = ?";
        //删除条件的参数
        String[] whereArgs = {id + "", name, sex, age, hobby};
        database.delete(TABLE_NAME, where, whereArgs);
        database.close();
    }

    /**
     * 再创建一个删除一个删除的方法,条件只有一个
     */
    public void delete(int id) {
        SQLiteDatabase database = getWritableDatabase();
        //当条件满足id = 传入的参数的时候,就删除那整行数据,有可能有好几行都满足这个条件,满足的全部都删除
        String where = "id = ?";
        String[] whereArgs = {id + ""};
        database.delete(TABLE_NAME, where, whereArgs);
        database.close();
    }

    /**
     * 创建一个修改数据的方法
     * @param id   条件,修改id为"id"的那一行数据
     * @param name
     * @param sex
     * @param age
     * @param hobby
     */
    public void updata(int id,String name, String sex, String age, String hobby) {
        SQLiteDatabase database = getWritableDatabase();
//        update(String table,ContentValues values,String  whereClause, String[]  whereArgs)
        String where = "id = ?";
        String[] whereArgs = {id+""};
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("sex", sex);
        values.put("age", age);
        values.put("hobby", hobby);
        //参数1  表名称	参数2  跟行列ContentValues类型的键值对Key-Value
       // 参数3  更新条件(where字句)	参数4  更新条件数组
        database.update(TABLE_NAME, values,where, whereArgs);
        database.close();
    }
}

mainActivity里面的代码逻辑
package com.duanlian.databasedemo;

import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import com.duanlian.databasedemo.adapter.MyListViewAdapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    private List<Map<String, Object>> list;
    private MyListViewAdapter adapter;
    private ListView mListView;


    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        setListener();
    }


    private void initView() {
        mListView = (ListView) findViewById(R.id.main_listview);
        List<Map<String, Object>> data = getData();
        adapter = new MyListViewAdapter(this, data);
        mListView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }

    private void setListener() {
        //点击跳转
        findViewById(R.id.insert).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, AddActivity.class);
                startActivityForResult(intent, 0);
            }
        });
        //ListView的监听事件
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//            private int id;

            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
//                //删除是要拿到当前行的id值才能删除当前行,下面的操作都是点击某个item拿到对应item的id字段
//                //拿到当前position的 item的所有数据
//                //返回的数据格式为{name=段炼, age=25, sex=男, id=12, hobby=吃饭。睡觉}
//                Object itemAtPosition = mListView.getItemAtPosition(position);
//                Log.e("duanlian", itemAtPosition+"");
//                //转换成String
//                String s = itemAtPosition.toString();
//                //如果字符串包含"id"字段
//                if (s.contains("id")) {
//                    //拿到id字段是处于字符串第几个位置
//                    int a = s.indexOf("id");
//                    //"id"字段后面是"hobby"字段,拿到hobby字段的位置
//                    int b = s.indexOf("hobby");
//                    //切割字符串{name=段炼, age=25, sex=男, id=12, hobby=吃饭。睡觉}
//                    //从i开始+3个正好是id开始的地方,hobby-2正好是id结束的位置减去了一个h和一个逗号
//                    String substring = s.substring(a + 3, b-2);
//                    //得到id后转换成int类型
//                    id = Integer.parseInt(substring);
//                }
//                //将得到id传入到需要的方法中
//                showMyDialog(id, position);
                //得到对应item里面的id
                Object id = list.get(position).get("id");
                int i = Integer.parseInt(id.toString());
                String name = list.get(position).get("name").toString();
                String sex = list.get(position).get("sex").toString();
                String age = list.get(position).get("age").toString();
                String hobby = list.get(position).get("hobby").toString();
                //将得到id传入到需要的方法中
                showMyDialog(i, name, sex, age, hobby);
            }
        });
    }

    /**
     * 点击显示对话框选择修改或者是删除
     */
    private void showMyDialog(final int id, final String name, final String sex, final String age, final String hobby) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        //设置一个标题
        builder.setTitle("请选择");
        //给dialog设置item
        builder.setItems(new String[]{"修改", "删除"}, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int position) {
                switch (position) {
                    case 0://修改
                        Intent intent = new Intent(MainActivity.this, CorrectActivity.class);
                        intent.putExtra("id", id);
                        intent.putExtra("name", name);
                        intent.putExtra("sex", sex);
                        intent.putExtra("age", age);
                        intent.putExtra("hobby", hobby);
                        startActivityForResult(intent,0);
                        break;
                    case 1://删除
                        MyDataBase.getInstances(MainActivity.this).delete(id);
                        //重新查询,然后显示
                        List<Map<String, Object>> data = getData();
                        adapter.refreshList(data);
                        Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
                        break;
                }

            }
        });
        builder.show();
    }

    /**
     * 通过查找数据库,拿到里面的数据
     */
    private List<Map<String, Object>> getData() {
        list = new ArrayList<>();
        Cursor query = MyDataBase.getInstances(MainActivity.this).query();
        /*
        游标cursor默认是在-1的位置,query.moveToFirst()将游标移动到第一行,如果不写这个就会报
         Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 12
         这个问题坑爹,以后一定要注意
         */
        if (query.moveToFirst()) {
            do {
                String name = query.getString(query.getColumnIndex("name"));
                String sex = query.getString(query.getColumnIndex("sex"));
                String age = query.getString(query.getColumnIndex("age"));
                String hobby = query.getString(query.getColumnIndex("hobby"));
                int id = query.getInt(query.getColumnIndex("id"));
                Map<String, Object> map = new HashMap<>();
                map.put("id", id);
                map.put("name", name);
                map.put("sex", sex);
                map.put("age", age);
                map.put("hobby", hobby);
                list.add(map);
            } while (query.moveToNext());
        }
        //关闭查询游标
        query.close();
        return list;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 0) {
            List<Map<String, Object>> data1 = getData();
//            adapter = new MyListViewAdapter(this, data1);
//            mListView.setAdapter(adapter);
            adapter.refreshList(data1);

        }
    }
}

插入数据逻辑
package com.duanlian.databasedemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class AddActivity extends AppCompatActivity {

    private EditText edt_name;
    private EditText edt_sex;
    private EditText edt_age;
    private EditText edt_hobby;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);
        initView();
    }

    private void initView() {
        edt_name = (EditText) findViewById(R.id.add_name);
        edt_sex = (EditText) findViewById(R.id.add_sex);
        edt_age = (EditText) findViewById(R.id.add_age);
        edt_hobby = (EditText) findViewById(R.id.add_hobby);
    }
    public void add(View view){
        //拿到输入的数据
        String name = edt_name.getText().toString().trim();
        String sex = edt_sex.getText().toString().trim();
        String age = edt_age.getText().toString().trim();
        String hobby = edt_hobby.getText().toString().trim();
        //调用插入方法
        MyDataBase.getInstances(AddActivity.this).insert(name,sex,age,hobby);
        finish();


    }

}

修改数据逻辑
package com.duanlian.databasedemo;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class CorrectActivity extends AppCompatActivity {

    private int id;
    private String name;
    private String sex;
    private String age;
    private String hobby;
    private EditText edt_name;
    private EditText edt_sex;
    private EditText edt_age;
    private EditText edt_hobby;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_correct);
        id = getIntent().getIntExtra("id", 0);
        name = getIntent().getStringExtra("name");
        sex = getIntent().getStringExtra("sex");
        age = getIntent().getStringExtra("age");
        hobby = getIntent().getStringExtra("hobby");
        initView();
    }

    private void initView() {
        edt_name = (EditText) findViewById(R.id.correct_name);
        edt_sex = (EditText) findViewById(R.id.correct_sex);
        edt_age = (EditText) findViewById(R.id.correct_age);
        edt_hobby = (EditText) findViewById(R.id.correct_hobby);
        edt_name.setText(name);
        edt_sex.setText(sex);
        edt_age.setText(age);
        edt_hobby.setText(hobby);
    }

    public void choose(View view) {
        switch (view.getId()) {
            case R.id.correct_cancel:
                finish();
                break;
            case R.id.correct_sure:
                //得到输入的
                String name = edt_name.getText().toString().trim();
                String sex = edt_sex.getText().toString().trim();
                String age = edt_age.getText().toString().trim();
                String hobby = edt_hobby.getText().toString().trim();
                //调用修改方法
                MyDataBase.getInstances(CorrectActivity.this).updata(id, name, sex, age, hobby);
                finish();
                break;

        }
    }
}


demo下载地址:

没有更多推荐了,返回首页