SQLite数据库基础

使用数据库SQLite 主要有两种方式进行操作,一种为写sql 语句,另外一种为 安卓已封装好sql方法 ,属于安卓自带的方法.

直接写sql 语句 有很大的方便性,而使用安卓自带的sql 方法局限性会多.

直接写sql 语句  ;  安卓自带的sql方法。

1.建库

有三种:
    一种是直接拼写SQL语句,使用SQLiteDatabase.execSQL("SQL")方法执行该SQL语句,
    第二种是使用 SQLiteOpenHelper 对象做CURD操作。
    第三种 Context.openOrCreateDatabase(name, mode, factory)
        参数:
        参数一:数据库名称,
        参数二:操作模式,  MODE_PRIVATE--默认模式   MODE_WORLD_READABLE--可读 MODE_WORLD_WRITEABLE--可写
        参数三:附加的一个工厂类,当SQLiteDatabase实例的query函数被调用时,会使用该工厂类返回一个Cursor。可为null。


说明:
    SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,
    然后分别在这两个方法中去实现创建、升级数据库的逻辑。

    onCreate(SQLiteDatabase db):创建数据库时的操作,如建表
    onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。 


    SQLiteOpenHelper中还有两个非常重要的实例方法,getReadableDatabase()和getWritableDatabase()。这两个方法都可
    以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进
    行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以
    只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。
  1. 建表

    SQLiteDatabase.execSQL(“create table 表名(id integer primary key autoincrement,列名 数据类型(最大长度),列名

    数据类型(最大长度)) ” )

    示例代码:

    create table Book (
    id integer primary key autoincrement,
    author text,
    price real,
    pages integer,
    name text);

  2. 增删改查

    3.1 第一种方式

    CURD  创建(Create)、更新(Update)、读取(Read)和删除(Delete)
    
    增:(插入)
    
        有占位符:
    
        SQLiteDatabase.execSQL("insert into 表名(要插入数据的列名1,要插入数据的列名2) values(?,?) ,new Object[]
        {"插到列名1的数据", "插到列名2的数据" }");
    
        参数一:要执行的SQL,
        参数二:占位符(?)所对应的数据
    
        无占位符:
    
        SQLiteDatabase.execSQL("insert into 表名(要插入数据的列名1,要插入数据的列名2) values('插到列名1的数据',
        '插到列名2的数据') ");
    
    删除(删):
    
        有占位符:
        SQLiteDatabase.execSQL("delete from 表名 where 要删除数据的列名 = ?",new String[]{"要删除的对比信息"});
        无占位符:
        SQLiteDatabase.execSQL("delete from 表名 where 要删除数据的列名 = '要删除的对比信息'");
    
    修改(改):
    
        有占位符:
    
        SQLiteDatabase.execSQL("update 表名 set 要修改数据的列名 = ? where 要插入数据的列名= ?",new String[]{"修改后
        ,该列名对应的数据","该列名对应的原始数据"});
    
        无占位符:
        SQLiteDatabase.execSQL("update 表名 set 要修改数据的列名 = '修改后的数据' where 要修改数据的列名='修改前的数据'");
    
    查询(查):
    
        Cursor(指针) cursor=SQLiteDatabase.rawQuery("select * from 表名 where  要查询数据的列名 = ?",new String[]
        {"要查询的数据" });
    
        cursor.getCount():通过指定条件查询出的数据的总条数
        cursor.moveToNext();是否还有下一条符合条件的数据
    

    3.2 第二种方式 安卓自带

    增: SQLiteDatabase.insert(table, nullColumnHack, values)
        参数一:表名
        参数二:当values参数为空或者里面没有内容的时候,就会将你指定的这个列名的值设为null,然后再向数据库中插入
        参数三:代表一行要插入的数据。
    
        返回值(long):插入不成功返回-1,插入成功返回行号ID
    
    删: SQLiteDatabase.delete(table, whereClause, whereArgs)
    
        参数一:表名
        参数二:删除条件
        参数三:删除条件里(参数二),占位符(?)所对应的参数列表
    
        返回值(int):被删除的行数(影响的行数)
    
    改: SQLiteDatabase.update(table, values, whereClause, whereArgs)
    
        参数一:表名
        参数二:要修改的数据
        参数三:修改条件
        参数四:修改条件里(参数二),占位符(?)所对应的参数列表
    
        返回值(int):被修改的行数(影响的行数)
    
    查: SQLiteDatabase.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)
    
        Table 表名 
        Columens 要返回的列
        Selection 查询条件
        selectionArgs 查询条件占位符对应的内容
        groupBy 分组判断条件
        Having 是否含有的判断条件
        orderBy  排序判断条件
        Limit  分页查询判断条件
    
        返回值(Cursor ):Cursor 对象里包含了查询到的数据
    
    查询使用的方法:
    
        Cursor.moveToNext()//指针是否可以移动到下一行(是否还有下一行数据)
        Cursor.getColumnIndex(String columnName)//获取指定列所在列的索引
        Cursor.getString(int columnIndex);//根据指定的列的索引,去拿与该列对应的数据,返回值为String
        Cursor.getInt(int columnIndex);//根据指定的列的索引,去拿与该列对应的数据,返回值为int
        Cursor.getLong(int columnIndex);//根据指定的列的索引,去拿与该列对应的数据,返回值为long
    
  3. 注意事项:

    4.1 在有占位符(?)的SQL中,占位符的顺序与其内容所对应的数组的元素的顺序一致

  4. 示例代码

一。 第一种方式

a. 建立数据库
    public class MyHelper extends SQLiteOpenHelper{
        private static String NAME="day02.db";

        //建表语句
        private static  String CREATE_TABLE=" create table day02 (_id integer primary key autoincrement ,name text ,age text);";
        // 四个参数 : context 上下文  name 数据库的名称  factory 游标工厂  version 版本号,必须从一开始
        public MyHelper(Context context) {
            super(context, NAME, null, 1);
        }
            //当数据库创建的时候调用
        @Override
        public void onCreate(SQLiteDatabase db) {
            //建表
            db.execSQL(CREATE_TABLE);

        }
            //更新数据库的时候调用 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // 比较 oldVersion 与 newVersion ,newVersion 大于  oldVersion 则进行更新操作。
    //      Toast.makeText(context, text, duration).show();
        }

    }

b. 建立Bean 接收数据

    public class Person {
        public Person(int id, String name, int age) {
            super();
            this.id = id;
            this.name = name;
            this.age = age;
        }

        public Person() {
            super();
            // TODO Auto-generated constructor stub
        }

        private int id;
        private String name;
        private int age;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

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

        public int getAge() {
            return age;
        }

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

        @Override
        public String toString() {
            return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
        }

    }

c. 活动中代码实现,展示:

    public class MainActivity extends Activity implements OnClickListener{

        private MyHelper myHelper;
        private EditText name;
        private EditText age;
        private String name5;
        private String age5;
        private TextView content;
        private ListView listView;
        private ArrayList<Person> list;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //1.获取数据库对象 ,该对象还未创建表格

            myHelper = new MyHelper(this);

            list = new ArrayList<Person>();
            init();

        }

        private void init() {
            Button add=(Button) findViewById(R.id.add);
            Button delt=(Button) findViewById(R.id.delt);
            Button query=(Button) findViewById(R.id.query);
            Button update=(Button) findViewById(R.id.update);
            name = (EditText) findViewById(R.id.name);
            age = (EditText) findViewById(R.id.age);
            content = (TextView) findViewById(R.id.content);
            listView = (ListView) findViewById(R.id.listView);
            add.setOnClickListener(this);
            delt.setOnClickListener(this);
            query.setOnClickListener(this);
            update.setOnClickListener(this);
    //      SQLiteDatabase db=SQLiteDatabase.openDatabase(path, factory, flags);
    //      SQLiteDatabase.openOrCreateDatabase(file, factory);

        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.add:
                //获取数据
                String name1=name.getText().toString();
                String age1=age.getText().toString();
                //1.  通过帮助实例,获取数据库 ,此时会调用  帮助类中的 onCreate 方法。
                SQLiteDatabase database_add = myHelper.getWritableDatabase();
                //2.  给表中添加数据 定义sql语句
                String sql="insert into day02 (name,age) values (?,?);";
                //3.  执行sql 语句
                database_add.execSQL(sql, new String[]{name1,age1});
                //4. 关闭数据库
                database_add.close();
                break;
            case R.id.delt:
                //将相同名字的条目删除
                String name2=name.getText().toString();
                //1. 通过帮助实例,获取数据库, 此时会调用 帮助类中的 onCreate 方法
                SQLiteDatabase database_delt = myHelper.getWritableDatabase();
                //2. 定义删除 sql 语句 
                String sql_delt ="delete from day02 where name=?;";
                //3. 执行sql 语句
                database_delt.execSQL(sql_delt, new String[]{name2});
                //4. 关闭数据库
                database_delt.close();
                break;
            case R.id.update:
                //清空集合
                list.clear();
                //根据名字更新年龄
                String name3=name.getText().toString();
                String age3=age.getText().toString();
                //1、 通过帮助实例,获取数据库 ,此时会调用 帮助类 中的 onCreate 方法
                SQLiteDatabase database_update = myHelper.getWritableDatabase();
                //2. 定义更新sql语句
                String sql_update="update day02 set age=? where name=? ;";
                //3. 执行sql语句
                database_update.execSQL(sql_update, new String[]{age3,name3});
                //4. 关闭数据库
                database_update.close();
                break;
            case R.id.query:
                //根据名字查询数据
                String name4=name.getText().toString();
                String age4=age.getText().toString();
                //1. 获取帮助实例,获取数据库,此时会调用帮助类中的 onCreate 方法
                SQLiteDatabase database_query = myHelper.getWritableDatabase();
                //2. 定义查询语句 结果集
                String sql_select=" select * from day02 where name = ? ;";
                 Cursor cursor = database_query.rawQuery(sql_select, new String[]{name4});
                 //3.遍历结果集
                while(cursor.moveToNext()){

                    String name5=cursor.getString(cursor.getColumnIndex("name"));
                    int age5=cursor.getInt(cursor.getColumnIndex("age"));
                    int id5=cursor.getInt(cursor.getColumnIndex("_id"));
                    Person person=  new Person(id5, name5, age5);
                    list.add(person);
                }
                listView.setAdapter(new ArrayAdapter<Person>(MainActivity.this, android.R.layout.simple_list_item_1, list));
        /*      //2. 定义查询语句 结果集
                Cursor cursor = database_query.query("day02", new String[]{"name","age"}, "name=?", new String[]{name4}, null, null, null);
                //3. 遍历结果集
                while(cursor.moveToNext()){

                    name5 += cursor.getString(cursor.getColumnIndex("name"));
                    age5 += cursor.getString(cursor.getColumnIndex("age"));

                    content.setText("NAME--------"+name5+"age_____"+age5);
                }*/
                //关闭数据库
                database_query.close();
                break;

            default:
                break;
            }

        }


    }

d. 控件
    <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:gravity="center_horizontal"
        android:orientation="vertical" >

        <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="姓名" />

        <EditText
        android:id="@+id/age"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="年龄" />

        <Button
        android:id="@+id/add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="添加" />

        <Button
        android:id="@+id/delt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="删除" />

        <Button
        android:id="@+id/update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="修改" />

        <Button
        android:id="@+id/query"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查询" />

        <TextView
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="数据展示"
        android:textColor="#66ff0000" 
        />
        <ListView 
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        ></ListView>

    </LinearLayout>

二。 第二种方式

a. 创建数据库
    public class MyHelper extends SQLiteOpenHelper{
        private static String NAME="day02.db";

        //建表语句
        private static  String CREATE_TABLE=" create table day02 (_id integer primary key autoincrement ,name text ,age text);";
        // 四个参数 : context 上下文  name 数据库的名称  factory 游标工厂  version 版本号,必须从一开始
        public MyHelper(Context context) {
            super(context, NAME, null, 1);
        }
            //当数据库创建的时候调用
        @Override
        public void onCreate(SQLiteDatabase db) {
            //建表
            db.execSQL(CREATE_TABLE);
        }
            //更新数据库的时候调用 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // 比较 oldVersion 与 newVersion ,newVersion 大于  oldVersion 则进行更新操作。
    //      Toast.makeText(context, text, duration).show();
        }

    }
b. 创建Bean ,按对象接收数据
    public class Person {
        public Person(int id, String name, int age) {
            super();
            this.id = id;
            this.name = name;
            this.age = age;
        }

        public Person() {
            super();
            // TODO Auto-generated constructor stub
        }

        private int id;
        private String name;
        private int age;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

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

        public int getAge() {
            return age;
        }

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

        @Override
        public String toString() {
            return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
        }

    }
c. 主活动 代码实现,并展示

    public class MainActivity extends Activity implements OnClickListener{

        private MyHelper myHelper;
        private EditText name;
        private EditText age;
        private String name5;
        private String age5;
        private TextView content;
        private ListView listView;
        private ArrayList<Person> list;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //1.获取数据库对象 ,该对象还未创建表格

            myHelper = new MyHelper(this);

            list = new ArrayList<Person>();
            init();

        }

        private void init() {
            Button add=(Button) findViewById(R.id.add);
            Button delt=(Button) findViewById(R.id.delt);
            Button query=(Button) findViewById(R.id.query);
            Button update=(Button) findViewById(R.id.update);
            name = (EditText) findViewById(R.id.name);
            age = (EditText) findViewById(R.id.age);
            content = (TextView) findViewById(R.id.content);
            listView = (ListView) findViewById(R.id.listView);
            add.setOnClickListener(this);
            delt.setOnClickListener(this);
            query.setOnClickListener(this);
            update.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.add:
                //获取数据
                String name1=name.getText().toString();
                String age1=age.getText().toString();
                //1.  通过帮助实例,获取数据库 ,此时会调用  帮助类中的 onCreate 方法。
                SQLiteDatabase database_add = myHelper.getWritableDatabase();

                //2.  给表中添加数据 定义sql语句
                ContentValues values=new ContentValues();
                values.put("name", name1);
                values.put("age", age1);
                database_add.insert("day02", null, values);
                //4. 关闭数据库
                database_add.close();
                break;
            case R.id.delt:
                //将相同名字的条目删除
                String name2=name.getText().toString();
                //1. 通过帮助实例,获取数据库, 此时会调用 帮助类中的 onCreate 方法
                SQLiteDatabase database_delt = myHelper.getWritableDatabase();
                //2. 定义删除  语句 
                database_delt.delete("day02", "name=?", new String[]{name2});
                //3. 关闭数据库
                database_delt.close();
                break;
            case R.id.update:
                //根据名字更新年龄
                String name3=name.getText().toString();
                String age3=age.getText().toString();
                //1、 通过帮助实例,获取数据库 ,此时会调用 帮助类 中的 onCreate 方法
                SQLiteDatabase database_update = myHelper.getWritableDatabase();
                //2. 执行跟新语句
                ContentValues values2=new ContentValues();
                values2.put("name", "xiaomingming");
                values2.put("age", "20周岁");
                database_update.update("day02", values2, "name=?", new String[]{name3});
                //3. 关闭数据库
                database_update.close();
                break;
            case R.id.query:
                //清空数据
                list.clear();
                //根据名字查询数据
                String name4=name.getText().toString();
                String age4=age.getText().toString();
                //1. 获取帮助实例,获取数据库,此时会调用帮助类中的 onCreate 方法
                SQLiteDatabase database_query = myHelper.getWritableDatabase();
                //2. 执行查询语句 获取 结果集
                Cursor cursor = database_query.query("day02", null, "name=?", new String[]{name4}, null, null, null);
                 //3.遍历结果集
                while(cursor.moveToNext()){

                    String name5=cursor.getString(cursor.getColumnIndex("name"));
                    int age5=cursor.getInt(cursor.getColumnIndex("age"));
                    int id5=cursor.getInt(cursor.getColumnIndex("_id"));
                    Person person=  new Person(id5, name5, age5);
                    list.add(person);
                }
                listView.setAdapter(new ArrayAdapter<Person>(MainActivity.this, android.R.layout.simple_list_item_1, list));

                //4.关闭数据库
                database_query.close();
                break;

            default:
                break;
            }

        }


    }

d. 布局文件

    <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:gravity="center_horizontal"
        android:orientation="vertical" >

        <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="姓名" />

        <EditText
        android:id="@+id/age"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="年龄" />

        <Button
        android:id="@+id/add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="添加" />

        <Button
        android:id="@+id/delt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="删除" />

        <Button
        android:id="@+id/update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="修改" />

        <Button
        android:id="@+id/query"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查询" />

        <TextView
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="数据展示"
        android:textColor="#66ff0000" 
        />
        <ListView 
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        ></ListView>

    </LinearLayout>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值