安卓第四天笔记-Sqlite
安卓第四天笔记-Sqlite
1.数据库的创建运行与更新
1.1.创建一个类继承SqliteOpenHelper
1.2.创建构造方法
/** * 数据库创建类 * @author 刘楠 * * 2016-2-20上午10:04:34 */ public class DbSqliteOpenHelper extends SQLiteOpenHelper { /** * * @param context 上下文 * @param name 数据库的名字如: students.db * @param factory 游标工厂 ,类似JDBC中的ResultSet中的hasNext(); * @param version 数据库的版本 */ public DbSqliteOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } /** * 当数据库被创建时,执行, * 只会执行一次 */ @Override public void onCreate(SQLiteDatabase db) { } /** * 当数据版本升级时执行, * 数据版本只能升不能降 从1开始 * 这里常用于更改数据库中的表的结构,如添加列,删除列,之类的,创建新的表 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
1.3.更改构造方法
/** * * @param context 上下文 * @param name 数据库的名字如: students.db * @param factory 游标工厂 ,类似JDBC中的ResultSet中的hasNext(); * @param version 数据库的版本 */ public DbSqliteOpenHelper(Context context) { super(context, "student.db", null, 1); } 更改后 /** * * @param context 上下文 * @param name 数据库的名字如: students.db * @param factory 游标工厂 ,类似JDBC中的ResultSet中的hasNext(); * @param version 数据库的版本 这里的版本必须大于0,如果为0就会报错 */ public DbSqliteOpenHelper(Context context) { super(context, "student.db", null, 1); }
源码中的解释,数据库版本必须大于等于0,否则会抛出异常
将数据库版本设置为0,运行
不能降版本
1.4.在onCreate方法中创建数据库表
/** * 当数据库被创建时,执行, * 只会执行一次 */ @Override public void onCreate(SQLiteDatabase db) { //创建数据库表 //sql create table students(_id integer primary key, name varchar(30)) db.execSQL("create table students(_id integer primary key, name varchar(30))"); Log.i(TAG, "onCreate 方法执行了"); }
1.5.在Activity中实例化
/** * 数据库初始化 * @author 刘楠 * * 2016-2-20上午10:27:04 */ public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private DbSqliteOpenHelper helper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化 helper = new DbSqliteOpenHelper(this); Log.i(TAG, "helper 实例化"); //执行下方的代码后才会创建数据库 helper.getWritableDatabase(); } }
创建数据库后并不会被创建,只有执行了,getReadDatabase或者getWriteDatabase(),
才会执行onCreate中的方法
运行查看LOG
1.6.数据已经创建,查看数据库
将数据库文件导出到桌面
SQLite Expert Professional 3打开
1.7.修改数据库版本,同是添加一列
/** * 当数据版本升级时执行, * 数据版本只能升不能降 从1开始 * 这里常用于更改数据库中的表的结构,如添加列,删除列,之类的,创建新的表 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i(TAG, "onUpgrade 方法执行了"); //sql alter table students add gender varchar(10) //添加列 db.execSQL("alter table students add gender varchar(10)"); }
查看日志
1.8.导出数据库中的文件再次查看
列已经添加成功
2.传统方式操作数据库
使用sql来操作数据库
/** * 传统数据库操作工具类 * @author 刘楠 * * 2016-2-20下午12:19:16 */ public class StudentDao { private static final String TAG = "StudentDao"; /* * 操作数据库类 */ private DbSqliteOpenHelper helper; public StudentDao(Context context){ helper = new DbSqliteOpenHelper(context); } /** * 插入方法 * @param name 姓名 * @param gender 性别 * @param stuno 学号 */ public void insert(String name,String gender,String stuno){ //获取数据 SQLiteDatabase db = helper.getWritableDatabase(); String sql="insert into students values (null,?,?,?)"; //填充占位符 Object [] bindArgs={name,gender,stuno}; //执行SQL db.execSQL(sql, bindArgs); //关闭数据库连接 db.close(); } /** * 修改更改 update * @param name 姓名 * @param gender 性别 * @param stuno 学号 */ public void update(String name,String gender,String stuno){ //获取数据 SQLiteDatabase db = helper.getWritableDatabase(); String sql="update students set gender=?,stuno=? where name=?"; //填充占位符 Object [] bindArgs={gender,stuno,name}; //执行SQL db.execSQL(sql, bindArgs); //关闭数据库连接 db.close(); } /** * 删除 * @param name 姓名 */ public void delete(String name){ //获取数据 SQLiteDatabase db = helper.getWritableDatabase(); String sql="delete from students where name=?"; //填充占位符 Object [] bindArgs={name}; //执行SQL db.execSQL(sql, bindArgs); //关闭数据库连接 db.close(); } /** * 查询全部 * */ public void getAll(){ //获取数据 SQLiteDatabase db = helper.getReadableDatabase(); String sql="select _id,name,gender,stuno from students"; //执行SQL Cursor cursor = db.rawQuery(sql, null); while(cursor.moveToNext()){ int _id = cursor.getInt(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); String gender = cursor.getString(cursor.getColumnIndex("gender")); String stuno = cursor.getString(cursor.getColumnIndex("stuno")); Log.i(TAG, "_id:"+_id+"name:"+name+",gender:"+gender+",stuno:"+stuno); } cursor.close(); //关闭数据库连接 db.close(); } /** * 查询全部 * */ public void getOne(String stuname){ //获取数据 SQLiteDatabase db = helper.getReadableDatabase(); String sql="select _id,name,gender,stuno from students where name=?"; String[] selectionArgs = {stuname}; //执行SQL Cursor cursor = db.rawQuery(sql, selectionArgs); while(cursor.moveToNext()){ int _id = cursor.getInt(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); String gender = cursor.getString(cursor.getColumnIndex("gender")); String stuno = cursor.getString(cursor.getColumnIndex("stuno")); Log.i(TAG, "_id:"+_id+"name:"+name+",gender:"+gender+",stuno:"+stuno); } cursor.close(); //关闭数据库连接 db.close(); } }
测试类
/** * 测试传统方式数据库工具类 * @author 刘楠 * * 2016-2-20下午12:48:37 */ public class TestStudentDao extends AndroidTestCase{ private StudentDao studentDao; @Override protected void setUp() throws Exception { studentDao = new StudentDao(getContext()); } /** * 测试插入 */ public void testInsert(){ studentDao.insert("lisi", "man", "heimaAndroid2179"); } /** * 测试插入 */ public void testDelete(){ studentDao.delete("liunan"); } /** * 测试修改 */ public void testUpdate(){ studentDao.update("lisi", "女", "33"); } /** * 测试查询全部 */ public void testGetAll(){ studentDao.getAll(); } /** * 测试查询一个 */ public void testGetOne(){ studentDao.getOne("lisi"); } }
3.数据版本判断与更新
/** * 数据库创建类 * @author 刘楠 * * 2016-2-20上午10:04:34 */ public class DbSqliteOpenHelper extends SQLiteOpenHelper { private static final String TAG = "DbSqliteOpenHelper"; /** * * @param context 上下文 * @param name 数据库的名字如: students.db * @param factory 游标工厂 ,类似JDBC中的ResultSet中的hasNext(); * @param version 数据库的版本 这里的版本必须大于0,如果为0就会报错 */ public DbSqliteOpenHelper(Context context) { super(context, "student.db", null,4); } /** * 当数据库被创建时,执行, * 只会执行一次 * 第二闪运行是就不会执行了 */ @Override public void onCreate(SQLiteDatabase db) { int version = db.getVersion(); Log.i(TAG, "version:"+version); Log.i(TAG, "onCreate 方法执行了"); if(version==0){ db.execSQL("create table students(_id integer primary key autoincrement, name varchar(30),gender varchar(10),stuno varchar(50))"); Log.i(TAG, "version=0执行了"); }else{ //创建数据库表 //sql create table students(_id integer primary key, name varchar(30)) db.execSQL("create table students(_id integer primary key autoincrement, name varchar(30))"); Log.i(TAG, "version不等0执行了"); } } /** * 当数据版本升级时执行, * 数据版本只能升不能降 从1开始 * 这里常用于更改数据库中的表的结构,如添加列,删除列,之类的,创建新的表 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i(TAG, "onUpgrade 方法执行了"); Log.i(TAG, oldVersion+""); Log.i(TAG, newVersion+""); //算出新 旧版本的差 int difference = newVersion-oldVersion; switch (difference) { case 1: db.execSQL("alter table students add gender varchar(10)"); Log.i(TAG, difference+""); break; case 2: db.execSQL("alter table students add gender varchar(10))"); db.execSQL("alter table students add stuno varchar(50))"); Log.i(TAG, difference+""); break; default: break; } } }
4.使用Android提供的API来操作数据库
/** * 使用Android中的API来执行操作数据库 * * @author 刘楠 * * 2016-2-20下午12:19:16 */ public class StudentDao2 { private static final String TAG = "StudentDao2"; /* * 操作数据库类 */ private DbSqliteOpenHelper helper; public StudentDao2(Context context) { helper = new DbSqliteOpenHelper(context); } /** * 插入方法 * * @param name * 姓名 * @param gender * 性别 * @param stuno * 学号 */ public long insert(String name, String gender, String stuno) { // 获取数据 SQLiteDatabase db = helper.getWritableDatabase(); // 填充占位符 ContentValues values = new ContentValues(); values.put("name", name); values.put("gender", gender); values.put("stuno", stuno); String nullColumnHack = "values(null,?,?,?)"; // 执行SQL long insert = db.insert("students", nullColumnHack, values); // 关闭数据库连接 db.close(); return insert; } /** * 修改更改 update * * @param name * 姓名 * @param gender * 性别 * @param stuno * 学号 */ public int update(String name, String gender, String stuno) { // 获取数据 SQLiteDatabase db = helper.getWritableDatabase(); String sql = "update students set gender=?,stuno=? where name=?"; // 填充占位符 ContentValues values = new ContentValues(); values.put("gender", gender); values.put("stuno", stuno); // 执行SQL int update = db.update("students", values, " name=?", new String[]{name}); // 关闭数据库连接 db.close(); return update; } /** * 删除 * * @param name * 姓名 */ public int delete(String name) { // 获取数据 SQLiteDatabase db = helper.getWritableDatabase(); // 执行SQL int delete = db.delete("students", " name=?", new String[]{name}); // 关闭数据库连接 db.close(); return delete; } /** * 查询全部 * */ public void getAll() { // 获取数据 SQLiteDatabase db = helper.getReadableDatabase(); String sql = "select _id,name,gender,stuno from students"; // 执行SQL Cursor cursor = db.query("students", new String[]{"_id","name","gender","stuno"}, null, null, null, null, null); while (cursor.moveToNext()) { int _id = cursor.getInt(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); String gender = cursor.getString(cursor.getColumnIndex("gender")); String stuno = cursor.getString(cursor.getColumnIndex("stuno")); Log.i(TAG, "_id:" + _id + "name:" + name + ",gender:" + gender + ",stuno:" + stuno); } cursor.close(); // 关闭数据库连接 db.close(); } /** * 查询全部 * */ public void getOne(String stuname) { // 获取数据 SQLiteDatabase db = helper.getReadableDatabase(); // 执行SQL Cursor cursor = db.query("students", new String[]{"_id","name","gender","stuno"}, "name =?", new String[]{stuname}, null, null, null); while (cursor.moveToNext()) { int _id = cursor.getInt(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); String gender = cursor.getString(cursor.getColumnIndex("gender")); String stuno = cursor.getString(cursor.getColumnIndex("stuno")); Log.i(TAG, "_id:" + _id + "name:" + name + ",gender:" + gender + ",stuno:" + stuno); } cursor.close(); // 关闭数据库连接 db.close(); } }
测试
/** * 测试传统方式数据库工具类 * @author 刘楠 * * 2016-2-20下午12:48:37 */ public class TestStudentDao2 extends AndroidTestCase{ private static final String TAG = "TestStudentDao2"; private StudentDao2 studentDao2; @Override protected void setUp() throws Exception { studentDao2 = new StudentDao2(getContext()); } /** * 测试插入 */ public void testInsert(){ long result = studentDao2.insert("lisi", "man", "heimaAndroid2179"); Log.i(TAG, result+""); } /** * 测试插入 */ public void testDelete(){ int delete = studentDao2.delete("aa"); Log.i(TAG, delete+""); } /** * 测试修改 */ public void testUpdate(){ int update = studentDao2.update("lisi", "hh", "33"); Log.i(TAG, update+""); } /** * 测试查询全部 */ public void testGetAll(){ studentDao2.getAll(); } /** * 测试查询一个 */ public void testGetOne(){ studentDao2.getOne("gh"); } }
5.创建一个学生信息录入,使用ListView展示信息baseAdapter
布局 <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:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:text="学生信息管理系统" android:textColor="#77ff0000" android:textSize="29sp" /> <EditText android:id="@+id/et_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入学生姓名" /> <!-- 性别 --> <RadioGroup android:id="@+id/rgp" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <!-- 性别男 --> <RadioButton android:id="@+id/rb_male" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:checked="true" android:text="male" /> <!-- 性别女 --> <RadioButton android:id="@+id/rb_female" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="female" /> </RadioGroup> <!-- 保存 --> <Button android:id="@+id/btn_save" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="保存" /> <!-- 查询 --> <Button android:id="@+id/btn_querty" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查询全部学生信息" /> <ListView android:id="@+id/lv_item" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="#ff0000" android:dividerHeight="2dp"> </ListView> </LinearLayout>
ListView要使用的布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/iv_sex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_margin="20dp" android:src="@drawable/mr" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:layout_toRightOf="@id/iv_sex" > <TextView android:id="@+id/tv_no" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="学号" /> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/tv_no" android:text="姓名" /> <ImageView android:id="@+id/iv_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_margin="20dp" android:src="@drawable/delete" /> </RelativeLayout> </RelativeLayout>
数据库创建类
/** * 数据库创建类,与维护的类 继承SQLiteOpenHelper * @author 刘楠 * * 2016-2-20下午6:32:00 */ public class StudentSqliteOpenHelper extends SQLiteOpenHelper { private static final String TAG = "StudentSqliteOpenHelper"; public StudentSqliteOpenHelper(Context context) { super(context, "student.db", null, 2); } /** * 创建数据库时,执行一次,只执行一次 * 用来创建数据表 */ @Override public void onCreate(SQLiteDatabase db) { Log.i(TAG, "onCreate执行了"); //获取原来的版本,获取不到为0 int version = db.getVersion(); if(version==0){ //创建表 String sql= "create table students ( _id integer primary key autoincrement, name varchar(30),gender varchar(10))"; db.execSQL(sql); }else{ //创建表 String sql= "create table students ( _id integer primary key autoincrement, name varchar(30))"; db.execSQL(sql); } } /** * 当数据库版本发生变化时执行 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i(TAG, "onUpgrade执行了"); switch (oldVersion) { case 1: String sql= "alter table students add gender varchar(10)"; db.execSQL(sql); break; case 2: break; default: break; } } }
实体类
/** * 学生的封装类 * * @author 刘楠 * * 2016-2-20下午6:31:20 */ public class Student { /* * ID */ private int id; /* * 姓名 */ private String name; /* * 性别 */ private String gender; public Student() { super(); } public Student(int id, String name, String gender) { super(); this.id = id; this.name = name; this.gender = gender; } public String getGender() { return gender; } public int getId() { return id; } public String getName() { return name; } public void setGender(String gender) { this.gender = gender; } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } }
数据库工具类
/** * 学生数据库访问工具类 * * @author 刘楠 * * 2016-2-20下午6:45:03 */ public class StudentDao { /* * 数据库创建更新类 */ private StudentSqliteOpenHelper helper; public StudentDao(Context context) { helper = new StudentSqliteOpenHelper(context); } /** * 插入一条记录 * * @param name * 姓名 * @param gender * 性别 * @return 返回插入后的_id */ public long insert(String name, String gender) { // 获取数据库 SQLiteDatabase db = helper.getWritableDatabase(); // 插入的列 String nullColumnHack = "values(null,?,?)"; // 占位符 ContentValues values = new ContentValues(); values.put("name", name); values.put("gender", gender); // 执行 long insert = db.insert("students", nullColumnHack, values); // 关闭连接 db.close(); return insert; } /** * 修改一条记录 * * @param name * 姓名 * @param gender * 性别 * @return 返回插入后的_id */ public long update(String name, String gender) { // 获取数据库 SQLiteDatabase db = helper.getWritableDatabase(); // 插入的列 // 占位符 ContentValues values = new ContentValues(); values.put("gender", gender); // 执行 int update = db.update("students", values, "name = ?", new String[] { name }); // 关闭连接 db.close(); return update; } /** * 删除一条记录 * * @param name * 姓名 * * @return 返回删除后的_id */ public int delete(String name) { // 获取数据库 SQLiteDatabase db = helper.getWritableDatabase(); // 执行 int delete = db.delete("students", "name = ?", new String[] { name }); // 关闭连接 db.close(); return delete; } /** * 查询全部学生信息 * * @return */ public List<Student> getAll() { // 容器 List<Student> list = new ArrayList<Student>(); // 获取数据库 SQLiteDatabase db = helper.getReadableDatabase(); String[] columns = { "_id", "name", "gender" }; Cursor cursor = db.query("students", columns, null, null, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); String gender = cursor.getString(cursor.getColumnIndex("gender")); // 添加到集合中 list.add(new Student(id, name, gender)); } // 关闭游标 cursor.close(); // 关闭 db.close(); return list; } }
Activity
/** * 学生管理信息系统Activity * 步骤 * 1.获取用户输入姓名与选择的性别 * 2.判断是否为空,为空就提示,不为空 * 3.保存数据 * 4.点击查询,在下方的ListView中显示所有的学生信息 * 5.为ListView设置BaseAdapter * 6.实现getCount与getView方法 * 7.返回view * 8.点击删除,弹出提示对话框, * 9.取消什么也不做,确定就删除当前记录 * @author 刘楠 * * 2016-2-20下午8:59:43 */ public class MainActivity extends Activity implements OnClickListener { /* * 姓名 */ private EditText et_name; /* * 性别 */ private RadioGroup rgp; /* * 保存 */ private Button btn_save; /* * 查询 */ private Button btn_querty; /* * 学生列表 */ private ListView lv_item; /* * 学生表数据库操作类 */ private StudentDao studentDao; /* * 学生列表 */ private List<Student> list; /* * 学生列表适配器 */ private StuBaseAdapter stuBaseAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_name = (EditText) findViewById(R.id.et_name); rgp = (RadioGroup) findViewById(R.id.rgp); btn_save = (Button) findViewById(R.id.btn_save); btn_querty = (Button) findViewById(R.id.btn_querty); lv_item = (ListView) findViewById(R.id.lv_item); /* * 初始化数据库学生表的工具类 */ studentDao = new StudentDao(this); /* * 设置监听事件 */ btn_save.setOnClickListener(this); btn_querty.setOnClickListener(this); } /** * 单击事件监听器 */ @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_save: // 保存 save(); break; case R.id.btn_querty: // 查询 query(); break; } } /** * 查询学生列表 */ private void query() { refresh(); } private void refresh() { /* * 查询全部学生信息 */ list = studentDao.getAll(); if (stuBaseAdapter == null) { // 判断 为空就new ,为ListView设置适配器 stuBaseAdapter = new StuBaseAdapter(); lv_item.setAdapter(stuBaseAdapter); } else { // 通知ListView列表改变 stuBaseAdapter.notifyDataSetChanged(); } } /** * 保存学生信息 */ private void save() { // 获取学生输入的信息 String name = et_name.getText().toString().trim(); // 判断 if (TextUtils.isEmpty(name)) { Toast.makeText(this, "学生姓名不能为空", Toast.LENGTH_SHORT).show(); return; } // 获取性别 String gender = "male"; switch (rgp.getCheckedRadioButtonId()) { case R.id.rb_male: gender = "male"; break; case R.id.rb_female: gender = "female"; break; } // 开始保存 long insert = studentDao.insert(name, gender); if (insert > 0) { Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show(); et_name.setText(""); } else { Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show(); } } /** * 学生列表适配器 * * @author 刘楠 * * 2016-2-20下午7:28:15 */ private class StuBaseAdapter extends BaseAdapter { private static final String TAG = "StuBaseAdapter"; @Override public int getCount() { return list.size(); } @Override public View getView(int position, View convertView, ViewGroup parent) { Log.i(TAG, position + ""); View view; if (convertView == null) { view = View.inflate(MainActivity.this, R.layout.stu_item, null); } else { view = convertView; } // 得到学生对象 final Student student = list.get(position); ImageView iv_sex = (ImageView) view.findViewById(R.id.iv_sex); if ("male".equals(student.getGender())) { iv_sex.setImageResource(R.drawable.mr); } else if ("female".equals(student.getGender())) { iv_sex.setImageResource(R.drawable.miss); } TextView tv_no = (TextView) view.findViewById(R.id.tv_no); tv_no.setText("编号:" + student.getId()); TextView tv_name = (TextView) view.findViewById(R.id.tv_name); tv_name.setText("姓名:" + student.getName()); ImageView iv_delete = (ImageView) view.findViewById(R.id.iv_delete); iv_delete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 对话框来提示用户是否删除 AlertDialog.Builder builder = new AlertDialog.Builder( MainActivity.this); builder.setTitle("删除").setIcon(R.drawable.tools) .setMessage("确定要删除这条记录吗"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog,int which) { /* * 删除方法 */ int delete = studentDao.delete(student.getName()); if (delete > 0) { Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show(); // 刷新列表 refresh(); } else { Toast.makeText(MainActivity.this, "删除失败", Toast.LENGTH_SHORT).show(); } } }); builder.setNegativeButton("取消", null); builder.create().show(); } }); return view; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } } }
安卓第四天笔记-Sqlite的更多相关文章
- 安卓第十四天笔记-内容提供者(ContentProvider)
安卓第十四天笔记-内容提供者(ContentProvider) ContentProvider--内容提供者 1.ContentProvider简介 ContentProvider是不同应用程序之间进 ...
- 安卓第十天笔记-fragment
安卓第十天笔记-fragment Fragment(片段) 一.Fragment简介 *Fragment是3.0引入的API,主要为了解决平板,大屏幕手机显示问题 *Fragment代表了Activi ...
- 安卓第十三天笔记-服务(Service)
安卓第十三天笔记-服务(Service) Servcie服务 1.服务概念 服务 windows 服务没有界面,一直运行在后台, 运行在独立的一个进程里面 android 服务没有界面,一直运行在后台 ...
- 安卓第十一天笔记-Intent与inter-filter配置
安卓第十一天笔记-Intent与inter-filter配置 Intent与inter-filter配置 1.Intent对象简述 Android应用中有包含三种重要组件:Activity,Servi ...
- 《APUE》第四章笔记(2)
下面介绍对stat结构的各个成员的操作函数. 先贴个stat结构的图: access函数: #include <unistd.h> int access(const char *pathn ...
- 《APUE》第四章笔记(1)
1.引言 本章介绍文件系统的特征和文件的性质.从stat函数开始,逐个说明stat结构的每一个成员以了解文件的所有属性.在此过程中,还将会说明修改这些属性的各个函数,并更详细地查看UNIX文件系统的结 ...
- #Python编程从入门到实践#第四章笔记
#Python编程从入门到实践#第四章笔记 操作列表 1.遍历列表 使用for循环,遍历values列表 for value in values: print(value) 2.数字列表 使 ...
- Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介)
原文:Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介) 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...
- iOS阶段学习第四天笔记(循环)
iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ } 两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...
随机推荐
- 基于jQuery右下角旋转环状菜单代码
基于jQuery右下角旋转环状菜单代码.这是一款固定在页面的右下角位置,当用户点击了主菜单按钮后,子菜单项会以环状旋转进入页面,并使用animate.css来制作动画效果.效果图如下: 在线预览 ...
- 解决 -ERR Plaintext authentication disallowed on non-secure (SSL/TLS) connections 方案[sendmail, dovecot]
在linux下安装sendmail比较容易, 但是在配置sendmail时却是比较麻烦的, 特别是对于一些新手来说, 配置过程必须十分小心谨慎, 要知道, 错误是千奇百怪, 但是成功的结果就只有一个, ...
- overflow:hidden的另一层含义
overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是 很了解.一提到清除浮动,我们就会想到另外一个CSS样式 ...
- iframe无刷新跨域上传文件并获取返回值
通常我们会有一个统一的上传接口,这个接口会被其他的服务调用.如果出现不同域,还需要无刷新上传文件,并且获取返回值,这就有点麻烦了.比如,新浪微博启用了新域名www.weibo.com,但接口还是使用原 ...
- 免费素材下载:iOS 8 矢量 UI 素材套件
小伙伴们,苹果终于在今天凌晨推送了 iOS 8 的正式版.虽然该系统并未与 iPhone6 发布会同时亮相,但对于已经提前体验尝鲜过测试版的同学来说并不陌生.iOS 8 几乎每个图标都进行了重新设计, ...
- 探秘空值位图掩码(NULL bitmap mask)
这篇文章我想谈下空值位图掩码(NULL bitmap mask) ,并揭开它的神秘面纱.空值位图掩码是在存储引擎层为列是否存储NULL值进行编码.它是一个简单的位图掩码,如果值是1的话,表示这列有NU ...
- [Test] 单元测试艺术(2) 打破依赖,使用模拟对象,桩对象,隔离框架
在上节中,完成了第一个单元测试,研究了各种特性,在本节,将介绍一些更实际的例子.SUT依赖于一个不可操控的对象,最常见的例子是文件系统,线程,内存和时间等. 本系列将分成3节: 单元测试基础知识 打破 ...
- Winform开发框架之简易工作流设计
一讲到工作流,很多人第一反应就是这个东西很深奥,有时候又觉得离我们较为遥远,确实完善的工作流设计很多方面,而正是由于需要兼顾很多方面,一般通用的工作流都难做到尽善尽美.微软也提供了几个版本的WF框架支 ...
- {"集合已修改;可能无法执行枚举操作。"}
无论是向集合中添加元素还是从集合中删除元素,都会导致集合内部的变化,特别是集合遍历器的变化.例如 List<,,,,}; foreach(int x in list) { list.Remove ...
- 【jQuery基础学习】02 jQuery的DOM操作
DOM操作分为3个方面: DOM Core 任何一种支持DOM Core的语言都可以使用它,比如getElementById就是DOM Core操作 HTML-DOM 只能用来处理web文档 ...