SQLite数据库基础
来源:互联网 发布:三轴点胶系统如何编程 编辑:程序博客网 时间:2024/05/16 14:39
使用数据库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()方法则将出现异常。
建表
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);增删改查
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
注意事项:
4.1 在有占位符(?)的SQL中,占位符的顺序与其内容所对应的数组的元素的顺序一致
示例代码
一。 第一种方式
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>
0 0
- SQLite数据库基础
- SQLite数据库系列:基础
- Android基础-数据库SQLite
- sqlite数据库基础语句
- SQLite数据库基础
- Sqlite数据库基础
- SQLite数据库基础
- Sqlite数据库基础
- Android SQLite数据库基础
- SQLite数据库基础命令
- Android sqlite数据库编程基础
- Android基础之Sqlite数据库
- HTML5基础(SQLite数据库)
- 嵌入式数据库SQLite基础使用
- Python基础-数据库-使用SQLite
- Android Sqlite 数据库—基础篇
- Android基础笔记二之SQLite数据库
- android基础入门SQLite数据库操作(15)
- C++ Primer(第五版)练习6.26
- 详细的JQ冲突解决办法,导航所用jq与图片所用jq冲突解决方法
- leetcode87: Scramble String
- centos7安装confluence
- HDT11驱动在imx287板子上的应用
- SQLite数据库基础
- Acm Java 基础
- 使用navigationController和tabbarcontroller时,viewcontroller的导航标题无效解决方法
- TimesTen PM 的 discussion thread
- native 嵌套 h5(localstorage) 本地存储问题
- MySQL的行转列、列转行、连接字符串 concat、concat_ws、group_concat函数用法
- 学校学习ios教程笔记,第三节swift中的switch,for循环和while循环
- XML(一)
- 第二十二篇玩转【斗鱼直播APP】系列之弹出房间界面