DataActivity3.java

package com.hanqi.test5;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast; public class DataActivity3 extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_data3);
} //继承SQLiteOpenHelper
class DBHelper extends SQLiteOpenHelper
{
//构造方法
//name 数据库名
//version 所创建的数据库版本号
public DBHelper(String name,int version) {
//调用父类的构造方法,写在第一行
super(DataActivity3.this, name, null, version);
} //在创建数据库时调用
//回调方法
//什么时候创建数据库:连接数据库的时候,如果数据文件不存在
//只调用一次
@Override
public void onCreate(SQLiteDatabase db) { //1.创建数据库的语句
String creatTable = "create table user(_id integer PRIMARY KEY AUTOINCREMENT NOT NULL,name varchar,age int)";
db.execSQL(creatTable); //2.初始化数据
ContentValues cv = new ContentValues(); cv.put("name","房崇延"); cv.put("age", 20); //如果不成功返回-1
//第一个参数是表名
//第二个参数是空列的默认值
//第三个参数是字段和值的集合(key/value)
long l = db.insert("user",null,cv); Toast.makeText(DataActivity3.this, "id = "+ l, Toast.LENGTH_LONG).show(); } //升级数据库
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//执行升级
//update user set age = 27 where _id = ?
//? 是占位符,然后给占位符赋值
ContentValues cv = new ContentValues(); cv.put("age", 27); int rowcount = db.update("user",cv,"_id=? and name=?",new String[]{"1","TOM"});
Log.e("TAG","rowcount = "+rowcount); }
} //创建数据库
public void dt1_OnClick(View v)
{
//创建
DBHelper dh = new DBHelper("test.db",1);
//获取数据库实例
SQLiteDatabase sd = dh.getWritableDatabase();
sd.close();
}
//升级数据库
public void dt2_OnClick(View v)
{
//创建 实现工具类
DBHelper dh = new DBHelper("test.db",2); //连接数据库 获取数据库实例
SQLiteDatabase sd = dh.getWritableDatabase();
sd.close();
}
//插入数据
public void dt3_OnClick(View v)
{
//创建
DBHelper dh = new DBHelper("test.db",2);
//获取数据库实例
SQLiteDatabase sd = dh.getWritableDatabase(); ContentValues cv = new ContentValues();
cv.put("name","房子");
cv.put("age", "18"); long _id = sd.insert("user", null, cv); Log.e("TAG","_id = " + _id); sd.close();
}
//修改数据
public void dt5_OnClick(View v)
{
//创建
DBHelper dh = new DBHelper("test.db",2);
//获取数据库实例
SQLiteDatabase sd = dh.getWritableDatabase(); ContentValues cv = new ContentValues();
cv.put("name","房子1"); int count = sd.update("user", cv, "_id >=3", null); Log.e("TAG", "updatecount = " + count); sd.close();
}
//修改数据2
public void dt7_OnClick(View v)
{
//创建
DBHelper dh = new DBHelper("test.db",2);
//获取数据库实例
SQLiteDatabase sd = dh.getWritableDatabase(); //没有工具类时可以用下面这个方法 但是很繁琐
// 连接
//sd = SQLiteDatabase.openOrCreateDatabase("test.db",null);
//判断是否建表了,是否升级了 不如工具类好用 try {
//1.开启事务
sd.beginTransaction(); ContentValues cv = new ContentValues();
cv.put("age", "50"); int count = sd.update("user", cv, "_id =2", null); //抛出异常
boolean b = true;
if (b) {
throw new RuntimeException("出现异常了");
} count += sd.update("user", cv, "_id =3", null); Log.e("TAG", "updatecount = " + count); //2.设置事务执行成功
sd.setTransactionSuccessful();
//提交
}
catch (Exception e)
{
//回滚
e.printStackTrace(); Toast.makeText(DataActivity3.this, e.getMessage(), Toast.LENGTH_SHORT).show();
} //一定会被执行的代码
finally { //3.结束事务,1)提交 2)回滚
sd.endTransaction(); sd.close();
}
}
//删除数据
public void dt6_OnClick(View v)
{
//创建
DBHelper dh = new DBHelper("test.db",2);
//获取数据库实例
SQLiteDatabase sd = dh.getWritableDatabase(); ContentValues cv = new ContentValues(); int count = sd.delete("user","_id =4",null); Log.e("TAG", "deletecount = " + count); sd.execSQL("delete from user where _id =3"); sd.close();
}
//查询数据
public void dt4_OnClick(View v)
{
//创建
DBHelper dh = new DBHelper("test.db",2);
//获取数据库实例
SQLiteDatabase sd = dh.getWritableDatabase();
//全表查询
Cursor cursor = sd.query("user", null, null, null, null, null, null); //Cursor 一开始会定位在第一条数据的上方
//移动游标到数据的上面,提取数据后,再继续移动 while (cursor.moveToNext())
{
//cursor.getInt(0);
long _id = cursor.getLong(cursor.getColumnIndex("_id"));
// 不知道具体列时,可以用这个相对麻烦的方法 String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(2); Log.e("TAG", "_id = " + _id + "name =" + name + "age = " + age); }
cursor.close(); sd.close();
}
}

activity_data3.xml

<?xml version="1.0" encoding="utf-8"?>
<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: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="com.hanqi.test5.DataActivity3"
android:orientation="vertical"> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="创建数据库"
android:onClick="dt1_OnClick"
android:id="@+id/dt_1"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="升级数据库"
android:onClick="dt2_OnClick"
android:id="@+id/dt_2"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="增加数据"
android:onClick="dt3_OnClick"
android:id="@+id/dt_3"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询数据"
android:onClick="dt4_OnClick"
android:id="@+id/dt_4"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="修改数据"
android:onClick="dt5_OnClick"
android:id="@+id/dt_5"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除数据"
android:onClick="dt6_OnClick"
android:id="@+id/dt_6"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="事务操作"
android:onClick="dt7_OnClick"
android:id="@+id/dt_7"/> </LinearLayout>

效果图:

Android课程---关于数据存储的学习(3)之数据库和事务的更多相关文章

  1. Android课程---关于数据存储的学习(2)

    手机外部存储的学习 activity_data2.xml <?xml version="1.0" encoding="utf-8"?> <Li ...

  2. Android课程---关于数据存储的学习

    activity_data1.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  3. Android课程---关于数据存储的学习之总结

  4. Android开发8:数据存储(二)——SQLite数据库和ContentProvider的使用

    前言 啦啦啦各位小伙伴们许久不见了~学期末和过年期间自己忙着做其他事没能及时更新Android开发系列课程的博客,实在是罪过罪过~ 好啦~废话不多说,进入我们今天的主题.今天我们将和大家学习其他的数据 ...

  5. Android Learning:数据存储方案归纳与总结

    前言 最近在学习<第一行android代码>和<疯狂android讲义>,我的感触是Android应用的本质其实就是数据的处理,包括数据的接收,存储,处理以及显示,我想针对这几 ...

  6. Android中的数据存储(二):文件存储 2017-05-25 08:16 35人阅读 评论(0) 收藏

    文件存储 这是本人(菜鸟)学习android数据存储时接触的有关文件存储的知识以及本人自己写的简单地demo,为初学者学习和使用文件存储提供一些帮助.. 如果有需要查看SharedPreference ...

  7. 67.Android中的数据存储总结

    转载:http://mp.weixin.qq.com/s?__biz=MzIzMjE1Njg4Mw==&mid=2650117688&idx=1&sn=d6c73f9f04d0 ...

  8. Android中的数据存储

    Android中的数据存储主要分为三种基本方法: 1.利用shared preferences存储一些轻量级的键值对数据. 2.传统文件系统. 3.利用SQLite的数据库管理系统. 对SharedP ...

  9. Android五种数据存储方式

    android 五种数据存储 :SharePreferences.SQLite.Contert Provider.File.网络存储 Android系统提供了四种存储数据方式.分别为:SharePre ...

随机推荐

  1. 分布式之Zookeeper使用

    在zookeeper中可分为单一模式和集群模式. 具体详细的配置与操作,可参见:http://blog.csdn.net/shatelang/article/details/7596007. 单一模式 ...

  2. Android在layout xml中使用include

    Android include与merge标签使用详解 - shuqiaoniu的博客 - 博客频道 - CSDN.NEThttp://blog.csdn.net/shuqiaoniu/article ...

  3. UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包

    背景 项目上需要做UWP的自动安装包,在以前的公司接触的是TFS来做自动build. 公司要求用Jenkins来做,别笑话我,之前还真不晓得这个东西. 会的同学请看一下指出错误,不会的同学请先自行脑补 ...

  4. angular之上滑换页指令

    healthmallDirectives.directive("goodsTopRefresh", ['$window',function ($window) { return { ...

  5. 使用Spring发送带附件的电子邮件(站内和站外传送)

    JavaMail的介绍 JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.   虽然JavaMail是 ...

  6. yii2的分页和ajax分页

    要想使用Yii分页类第一步:在控制器层加载分页类 use yii\data\Pagination;第二步: 使用model层查询数据,并用分分页,限制每页的显示条数$data = User::find ...

  7. 【HTTP】模拟form提交表单(转)

    第一种:WebClient string postString = "arg1=a&arg2=b";//这里即为传递的参数,可以用工具抓包分析,也可以自己分析,主要是for ...

  8. 【算法杂谈】Miller-Rabin素性测试算法

    额,我们今天来讲一讲Miller-Rabin素性测试算法. 读者:怎么又是随机算法!!!(⊙o⊙)… [好了,言归正传] [费马小定理] 费马小定理只是个必要条件,符合费马小定理而非素数的数叫做Car ...

  9. 一些关于HTML与CSS的总结与实际应用

    //学习前端也快一年了,觉得有必要好好总结一下这一年来学过的知识.一些是前辈们的精华,文章最后会讲地址一一放出,若原作者有任何介意,请及时联系我删除. 关于DOCTYPE 1.DOCTYPE的作用是什 ...

  10. HDU-SupportOrNot训练实录

    菜鸡队训练实录. 现场赛记录: 2016:[名称:奖项/排名] ZJPSC:Gold/1 CCPC中南邀请赛:Gold/1 ICPC Dalian:Gold/24 ICPC Beijing:Gold/ ...