数据库 SQLite
Oracle SQLServer mySql SQLite 关系型数据
SQLite 数据库
Android系统中集成了轻量级的数据SQLite
一, 特点:
轻量级 只有一个动态的库, 是以单个文件的形式进行存取
零配置 无需安装
跨平台 支持多个操作系统
嵌入式 嵌入手机
在程序的内部,任何位置都能通过数据库的名称访问数据库, 其他用于程序无法通过数据库的名称对其访问
路径: data/data/应用程序包名/database/****
二 , 数据存储的类型
NULL 空值
INTEGER 整型
VARCHAR 可变长度的字符数据
TEXT 文本字符串
BOOLEAN 布尔
1, 创建表
create table if not exists 表名(字段名称 字段类型 primary key autoincrement,字段名称 字段类型,.....)
create table if not exists user(_id integer primary key autoincrement,name varchar(20),age integer)
2, 插入数据
insert into 表名(字段S) values(值S)
insert into user(name,age) values('小明',20)
3, 修改数据
update user set name='小攀' where _id=1
4, 查询数据
select (字段S) from 表名 where 字段 = 值
select * from user
模糊查询: select * from 表名 where name like '%o%'
5, 删除数据
delete from 表名 where 字段 = 值
delete from user where _id=2
四, 操作数据库的核心类
1, SQLiteDatabase 管理和操作数据库
特点:
提供了一个管理数据库的类
提供了增删改查的方法
数据库的名称是唯一的, 创建一次之后就是打开数据
获取数据库对象的方法
Context.openOrCreateDatabase(String name, int mode, CursorFactory factory);
SQLiteDatabase 主要提供的方法
void execSQL(String sql) 执行sql语句
Cusor rawQuery(String sql,String[] selectionArgs) 查询数据库符合要求的内容
封装好的方法: 适用于不懂SQL语句的用户
insert() 插入数据到指定的表中
update() 修改指定表中的数据
query() 查询表中的指定内容
delete() 删除表中指定的数据
2, SQLiteOpenHelper 用于数据库的创建和版本的更新
3, Cursor 游标
默认游标的位置显示在数据之上
boolean cursor.move(int offset) 游标向上或向下移动指定的行数 , 如果offset为正数,则表示向上移动; 如果为负数 表示向下移动; 并且判断当前数据是否存在
boolean cursor.moveToNext() 游标移动到下一条数据, 并且判断下一条数据是否存在
boolean cursor.moveToPrevious() 游标移动到上一条数据, 并且判断上一条数据是否存在
boolean cursor.moveToFirst()游标移动到第一条数据, 并且判断第一条数据是否存在
package com.qf.day13_phonebook;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import com.qf.day13_phonebook.db.DbService;
public class MainActivity extends Activity {
//控件
private ListView lv;
//数据源
private Cursor cursor;
//适配器
private SimpleCursorAdapter adapter;
private DbService dbService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
dbService = new DbService(this);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
setListAdapter();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
final int position, long id) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("请选择你的操作");
builder.setItems(new String[]{"编辑联系人","删除联系人"}, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 点击的是那个Item
switch (which) {
case 0:
//编辑联系人
//1, 游标指向指定的数据
if(cursor.moveToPosition(position))
{
//2, 从游标中获取当前点击的Item 对应的 姓名+电话
int id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
//3, 带着参数 进入编辑页面
Intent intent = new Intent(MainActivity.this, EditActivity.class);
intent.putExtra("id", id);
intent.putExtra("name", name);
intent.putExtra("phone", phone);
intent.putExtra("isAdd", false);
startActivity(intent);
}
break;
case 1:
//删除联系人
AlertDialog.Builder builder2 = new AlertDialog.Builder(MainActivity.this);
builder2.setIcon(R.drawable.ic_launcher);
builder2.setTitle("提示");
builder2.setMessage("是否确认删除?");
builder2.setNegativeButton("取消", null);
builder2.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//1, 游标移动到指定的位置
if(cursor.moveToPosition(position))
{
//2, 获取当前游标指向的ID
int id = cursor.getInt(cursor.getColumnIndex("_id"));
//从数据库中删除数据
dbService.delete(id);
//把游标创建的方法再次执行一次
//cursor.requery();
setListAdapter();
}
}
});
builder2.show();
break;
}
}
});
builder.show();
}
});
}
/**
* 获取数据源 设置适配器
*/
private void setListAdapter() {
//数据源
cursor = dbService.getUsers();
//适配器
adapter = new SimpleCursorAdapter(this,
R.layout.item_lv,
cursor,
new String[]{"name","phone"},
new int[]{R.id.name,R.id.phone},
SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
//设置适配器
lv.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 加载菜单布局
getMenuInflater().inflate(R.menu.main,menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_adduser:
Intent intent = new Intent(MainActivity.this, EditActivity.class);
intent.putExtra("isAdd", true);
startActivity(intent);
break;
}
return super.onOptionsItemSelected(item);
}
}
package com.qf.day13_phonebook;
import com.qf.day13_phonebook.db.DbService;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class EditActivity extends Activity {
private EditText nameEdit,phoneEdit;
private boolean isAdd;
private DbService dbService;
private int id;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit);
nameEdit = (EditText) findViewById(R.id.name_edit);
phoneEdit = (EditText) findViewById(R.id.phone_edit);
//接收传入的参数
Intent intent = getIntent();
isAdd = intent.getBooleanExtra("isAdd", true);
if(!isAdd)
{
id = intent.getIntExtra("id", 0);
String name = intent.getStringExtra("name");
String phone = intent.getStringExtra("phone");
nameEdit.setText(name);
phoneEdit.setText(phone);
}
//设置Activity标题
if(isAdd)
{
setTitle("添加联系人");
}else{
setTitle("编辑联系人");
}
dbService = new DbService(this);
}
public void submit(View v)
{
String name = nameEdit.getText().toString().trim();
String phone = phoneEdit.getText().toString().trim();
if(isAdd)
{
dbService.insertUsers(name,phone);
}
else{
dbService.updateUsers(id,name,phone);
}
finish();
}
}
package com.qf.day13_phonebook.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DbOperHelper extends SQLiteOpenHelper {
public DbOperHelper(Context context) {
super(context, "phone_book", null, 1);
// TODO Auto-generated constructor stub
}
//数据库创建时执行一次 在后台后连接数据库
@Override
public void onCreate(SQLiteDatabase db) {
//初始化表
db.execSQL("create table if not exists users(_id integer primary key autoincrement,name,phone)");
db.execSQL("insert into users(name,phone) values('张三','153110120')");
db.execSQL("insert into users(name,phone) values('李四','153120119')");
db.execSQL("insert into users(name,phone) values('王五','153110911')");
db.execSQL("insert into users(name,phone) values('赵六','153110114')");
}
//版本更新时执行
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
package com.qf.day13_phonebook.db;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
/**
* 操作数据库的封装类
*
* @author Administrator
*
*/
public class DbService {
private Context context;
private DbOperHelper dbOperHelper;
public DbService(Context context) {
this.context = context;
dbOperHelper = new DbOperHelper(context);
}
//得到联系表中的所有数据
public Cursor getUsers()
{
//1, 打开连接
SQLiteDatabase db = dbOperHelper.getReadableDatabase();
//2, 查询数据
return db.rawQuery("select * from users", null);
}
//添加联系人
public void insertUsers(String name, String phone) {
//1, 打开连接
SQLiteDatabase db = dbOperHelper.getWritableDatabase();
//2, 插入数据
ContentValues values = new ContentValues();
values.put("name", name);
values.put("phone", phone);
db.insert("users", null, values);
}
//编辑联系人
public void updateUsers(int id, String name, String phone) {
//1, 打开连接
SQLiteDatabase db = dbOperHelper.getWritableDatabase();
//2, 修改数据
ContentValues values = new ContentValues();
values.put("name", name);
values.put("phone", phone);
db.update("users", values, "_id="+id, null);
//db.update("users", values, "_id=?", new String[]{id+""});
}
//删除联系人
public void delete(int id) {
//打开连接
SQLiteDatabase db = dbOperHelper.getWritableDatabase();
//删除数据
db.execSQL("delete from users where _id="+id);
}
}
mainactivity 布局 <ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv"
android:divider="#eee"
android:dividerHeight="2dp"
/>
etit activity布局 <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名"
android:id="@+id/name_text"
android:layout_marginTop="50dp"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/name_edit"
android:layout_toRightOf="@id/name_text"
android:hint="请输入你的姓名"
android:layout_alignBaseline="@id/name_text"
android:background="@android:drawable/edit_text"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电话"
android:id="@+id/phone_text"
android:layout_below="@id/name_text"
android:layout_marginTop="50dp"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/phone_edit"
android:layout_toRightOf="@id/phone_text"
android:hint="请输入你的手机号"
android:layout_alignBaseline="@id/phone_text"
android:background="@android:drawable/edit_text"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="提交"
android:onClick="submit"
android:layout_below="@id/phone_text"
android:layout_marginTop="30dp"
android:id="@+id/btn"
/>
item_lv <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/name"
android:text="姓名"
android:textSize="25sp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/phone"
android:text="电话"
android:textSize="20sp"
android:layout_alignParentRight="true"
android:layout_below="@id/name"
android:layout_marginTop="10dp"
/>
boolean cursor.moveToLast() 游标移动到最后一条数据, 并且判断最后一条数据是否存在
boolean cursor.moveToPosition() 游标移动到某一条数据, 并且判断某一条数据是否存在
int cursor.getCount() 得到游标中数据的数量
取值
获取数据内容 cursor.getString(列的编号) //列的编号从0开始
根据列的名称得到列的编号: cursor.getColumnIndex("字段名称");
小的demo 联系人存储