Android SQLite 事务处理用法介绍

 更新时间:2016年9月20日 20:00  点击:2146
SQLite 事务处理和我们在mysql中事物处理原理差不多可以大批量处理数据并且可以回滚,下面小编给大家来介绍Android SQLite 事务处理用法,有需要了解的机友可参考。

.使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。

 

 代码如下 复制代码
public void payment() {
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
db.beginTransaction();//开始事务
try {
db.execSQL("update person set amount=amount-10 where personid=2");
db.execSQL("update person set amount=amount+10 where personid=5");
db.setTransactionSuccessful();// 设置事务的标志为true,调用此方法会在执行到endTransaction()方法是提交事务,若没有调用此方法会在执行到endTransaction()方法回滚事务。
} catch (SQLException e) {
} finally {
db.endTransaction();
}
// 结束事务,有两种情况:commit,rollback,
// 事务的提交或回滚是由事务的标志决定的,如果事务的标志为true就会提交,否则回滚,默认情况下事务的标志为false
}

应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始5000条记录也就是要5000次读写磁盘操作。
而且不能保证所有数据都能同时插入

加事务处理,把5000条插入作为一个事务


我们使用SQLite的事务进行控制:

 代码如下 复制代码
        db.beginTransaction();  //手动设置开始事务
        try{
            //批量处理操作
            for(Collection c:colls){
                insert(db, c);
            }
            db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交
           }catch(Exception e){
               MyLog.printStackTraceString(e);
           }finally{
               db.endTransaction(); //处理完成
           }
在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件。

解析XML文件:

在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。

SAX解析器:

SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。

SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。

DOM解析器:

DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。

由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。

PULL解析器:

在Android平台上可以使用SAX、DOM和Android附带的pull解析器解析XML文件;
pull解析器提供了各种事件,使用parser.next()方法进入下一个元素并触发相应事件,pull解析器产生的事件是一个数字,可以通过switch对感兴趣的事件进行处理;通过paser.nextText()方法可以获取下一个Text类型的节点的值;


读取XML

 代码如下 复制代码
XmlPullParser pullParser = Xml.newPullParser();
pullParser.setInput(xml, "UTF-8");//为破解器添加要解析的XML数据
int event = pullParser.getEventType();//开始读取,获取事件返回值
pullParser.getName();//获取节点名称
pullParser.getAttributeValue(0);//获取第一个属性的值
pullParser.nextText();//获取标签之后的节点的内容
event = pullParser.next();

//解析器遇到结束标签不会自动向下解析,需要调用此方法进行继续执行;

保存文件到XML

 代码如下 复制代码

public static void save(List<Person> persons, OutputStream outStream)
throws Exception, IllegalStateException, IOException {
XmlSerializer serializer = Xml.newSerializer();//获取XML写入信息的序列化对象
serializer.setOutput(outStream, "UTF-8");//设置要写入的OutputStream
serializer.startDocument("UTF-8", true);//设置文档标签

serializer.startTag(null, "persons");//设置开始标签,第一个参数为namespace
for (Person person : persons) {
serializer.startTag(null, "person");
serializer.attribute(null, "id", person.getId().toString());

serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name");

serializer.startTag(null, "age");
serializer.text(person.getAge().toString());
serializer.endTag(null, "age");

serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
outStream.flush();
outStream.close();
}

解析xml

 代码如下 复制代码

<?xml version="1.0" encoding="utf-8"?>
<books>
 <book>
  <id>1001</id>
  <name>Thinking In Java</name>
  <price>80.00</price>
 </book>
 <book>
  <id>1002</id>
  <name>Core Java</name>
  <price>90.00</price>
 </book>
 <book>
  <id>1003</id>
  <name>Hello, Andriod</name>
  <price>100.00</price>
 </book>
</books>

然后我们分别使用以上三种解析技术解析文档,得到一个List<Book>的对象,先来看一下Book.java的代码:

 代码如下 复制代码

package com.scott.xml.model;

public class Book {
 private int id;
 private String name;
 private float price;
 
 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 float getPrice() {
  return price;
 }

 public void setPrice(float price) {
  this.price = price;
 }

 @Override
 public String toString() {
  return "id:" + id + ", name:" + name + ", price:" + price;
 }
}

最后,我们还要把这个集合对象中的数据生成一个新的XML文档,生成的XML结构跟原始文档略有不同,是下面这种格式:

 代码如下 复制代码

<?xml version="1.0" encoding="UTF-8"?>
<books>
  <book id="1001">
    <name>Thinking In Java</name>
    <price>80.0</price>
  </book>
  <book id="1002">
    <name>Core Java</name>
    <price>90.0</price>
  </book>
  <book id="1003">
    <name>Hello, Andriod</name>
    <price>100.0</price>
  </book>
</books>

接下来,就该介绍操作过程了,我们先为解析器定义一个BookParser接口,每种类型的解析器需要实现此接口。BookParser.java代码如下:

 代码如下 复制代码

package com.scott.xml.parser;

import java.io.InputStream;
import java.util.List;

import com.scott.xml.model.Book;

public interface BookParser {
 /**
  * 解析输入流 得到Book对象集合
  * @param is
  * @return
  * @throws Exception
  */
 public List<Book> parse(InputStream is) throws Exception;
 
 /**
  * 序列化Book对象集合 得到XML形式的字符串
  * @param books
  * @return
  * @throws Exception
  */
 public String serialize(List<Book> books) throws Exception;
}

现在安卓手机开发的人群越来越多了,下面我来介绍很基础的android文件操作之文件读写操作,有需要学习了解的朋友可参考本文章。
 代码如下 复制代码

数据存储与访问常用方式:
文件
SharedPreferences(偏好参数设置)
SQLite数据库
内容提供者(Content provider)
网络

Activity(Context)
Context.getCacheDir()方法用于获取/data/data/<package name>/cache目录
Context.getFilesDir()方法用于获取/data/data/<package name>/files目录

Activity(Context)提供了openFileOutput(filename,mode)方法用于把数据输出到文件中;
第一个参数用于指定文件名称,不能包含路径分隔符‘/'
第二个参数为操作模式:
Context.MODE_PRIVATE:私有操作模式创建出来的文件只能被本程序访问,如果文件不存在,会自动创建,另外:写入文件中的内容会覆盖原文件的内容;
Context.MODE_APPEND:模式会检查文件是否存在,如果存在则会追加内容,否则创建新文件;
Context.MODE_READABLE:表示当前文件可以被其它应用读取;
Context.MODE_WRITEABLE:表示当前文件可以被其它应用写入;

如果希望文件被其它应用读和写:传入(Context.MODE_READABLE+Context.MODE_WRITEABLE)
FileOutputStream outStream = context.openFileOutput(filename,Context.MODE_PRIVATE);

例子

//写数据
public void writeFile(String fileName,String writestr{
  try{

        FileOutputStream fout =openFileOutput(fileName, MODE_PRIVATE);

        byte [] bytes = writestr.getBytes();

        fout.write(bytes);

        fout.close();
      }

        catch(Exception e){
        e.printStackTrace();
       }
}

//读数据
public String readFile(String fileName){
  String res="";
  try{
         FileInputStream fin = openFileInput(fileName);
         int length = fin.available();
         byte [] buffer = new byte[length];
         fin.read(buffer);    
         res = EncodingUtils.getString(buffer, "UTF-8");
         fin.close();    
     }
     catch(Exception e){
         e.printStackTrace();
     }
     return res;

}  

//param 文件名称,操作方式

android有一套自己的安全模型,当应用程序(.apk)在安装时系统会分配给一个userid,当该应用去访问其它资源如文件的时候,会进行 userid的匹配,默认情况下任何应用创建的文件,sharedpreferences,数据库都是私有的(创建的文件保存在/data/data /<package name>/files目录下),只有指定操作模式为外部可读或写才可以被其它程序访问;

读取文件:

<1>
FileInputStream inStream = context.openFileInput(filename);
Log.i(TAG,inStream....)

<2>
path="/data/data/<package name>/files/hello.txt";
File file = new File(path);
FileInputStream inStream = new FileInputStream(file);
Log.i(TAG,inStream....)

ctrl + shift + x/y 大小写

从resource的raw中读取文件数据:

String res = "";
try{
 
    //得到资源中的Raw数据流
    InputStream in = getResources().openRawResource(R.raw.test);

    //得到数据的大小
    int length = in.available();      

    byte [] buffer = new byte[length];       

    //读取数据
    in.read(buffer);        

    //依test.txt的编码类型选择合适的编码,如果不调整会乱码
    res = EncodingUtils.getString(buffer, "BIG5");
   
    //关闭   
    in.close();           

   }catch(Exception e){
      e.printStackTrace();        
   }

现在我来给大家总结一个实例

 代码如下 复制代码

/**
 * 【文件操作】
 */
package Iwit.IwitTest;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import android.content.Context;
import android.widget.Toast;

/**
 * @author Shine
 *【文件读,写】
 */
public class FileOperate

 /**
  * 【读取文件】
  * @param context
  * @param fileName
  * @return
  */
 public String ReadText(Context context,String fileName)
 {
       FileInputStream fIn = null;
       InputStreamReader isr = null;      
       char[] inputBuffer = new char[255];
       String data = null;      
       try
       {
        fIn =context.openFileInput(fileName);     
           isr = new InputStreamReader(fIn);
           isr.read(inputBuffer);
           data = new String(inputBuffer);
           Toast.makeText(context, "read Succeed",Toast.LENGTH_SHORT).show();
       }
      catch (Exception e)
          {     
       e.printStackTrace();
       Toast.makeText(context, " not read",Toast.LENGTH_SHORT).show();
          }
       finally
       {
              try {
                     isr.close();
                     fIn.close();
                   }
              catch (IOException e)
              {
                    e.printStackTrace();
              }
           }
       return data;
   }
 
 /**
  * 【写入文件】
  * @param context
  * @param fileName
  * @param data
  */
 public void WriteText(Context context, String fileName,String data)
 {
       FileOutputStream fOut = null;
       OutputStreamWriter osw = null;
      
       try{
        fOut =context.openFileOutput(fileName, 1);
           osw = new OutputStreamWriter(fOut);
           osw.write(data);
           osw.flush();
           Toast.makeText(context, " saved",Toast.LENGTH_SHORT).show();
           }
           catch (Exception e)
           {     
           e.printStackTrace();
           Toast.makeText(context, " not saved",Toast.LENGTH_SHORT).show();
           }
           finally
           {
              try {
                     osw.close();
                     fOut.close();
                   }
              catch (IOException e)
               {
                    e.printStackTrace();
                 }
           }
  }
}

上面就可以实现对文件的读写操作了

无线网络通常我们讲到的是wifi网络,也就是大家笔记本电脑上的网,下面我来介绍小米2手机怎么连接无线网络吧,有需要的朋友可参考。

1、在你小米手机中点击“系统”-“WLAN”如下图所示。

小米2手机怎么连接无线网络

2、然后我们再点击“WLAN”和“自动搜索”功能

小米2手机怎么连接无线网络

3、点击自动搜索之后小米手机就会自动搜索附近可以连接wifi网络了解。

小米2手机怎么连接无线网络

4、找到可连接的网络之后我们再点击wifi然后再输入密码即可连接了。

小米2手机怎么连接无线网络

手机wifi连接上但不能上网怎么办呢,下面我来总结关于导致wifi连接上了但是无法上网的原因分析与解决方法介绍,有碰到此类问题的朋友可进入参考。

连接wifi不能上网

好的,第一步,我们先来确定无线路由器已经设定成功了。验证的方法的话,可以先在笔记本电脑上查看一下有没有我们的WIFI信号

 看到有WIFI信号是第一步。第二步的话需要看一下这个信号是不是实际来自宽带网络,还是只是路由器的一厢情愿。验证方法是点击连接,让笔记本连接WIFI,输入设定的密码,如果有密码的话,打开百度首页


 完成了上面的步骤之后,说明我们的WIFI信号已经完全没有问题。坐等接入新的移动设备。
好的,现在的问题是,我们手机明明显示已经接入WIFI信号了。可是还是上不了网,或者网速像蜗牛。点击进入WIFI设置,先看看是不是我们的WIFI信号

 是啊,现在大家的WIFI信号那么多,还有那么多的干扰,移动的联通的“免费”的信号,很有可能自动接入的不是我们自己的WIFI信号。这时候只要及时点击选着我们的WIFI登录即可
好的,还有一种情况就是,明明连接的也是我们的账号,笔记本可以上网,可是手机的速度还是很慢很慢。怎么办?处理办法是这样的:首先确认你的其他启动设备没有过多的占用网速,可以先关闭它们试试

 如果这一招还不管用,那么先试试重启一下我们的手机,或者关闭WIFI之后重新连接
如果步骤7还是不成功的话,我们需要使用杀手锏,那就是关闭无线路由器,让它休息10分钟。十分钟之后重新打开无线路由器电源。因为路由器经过长时间的使用难免出现状况。

wifi连接不上原因分析

检查附近的热点环境,确保手机处于wifi信号覆盖范围内。针对这种情况,一般在打开wifi的时候,会有附近热点的提示信息,如果没有提示信息,就可以确定附近没有热点,此时,应当重新配置热点。

 确保你的操作步骤正确。具体操作方法是:进入手机设置 -> 无线网络设置 -> WLAN(勾选),进入“WLAN设置”在出现的列表中搜索到周边存在的无线局域网络,点击连接,输入密码,确定即可。

 关闭并重启WiFi连接:    用手机上网,手机中会保留一个由WiFi连接分配的网络IP地址,它会被应用到当前Wi-Fi中,如果没有出现地址冲突,就不用担心,如果有冲突就得关闭并重启WiFi连接。方法如下:  打开手机菜单,进入“设置”栏,选择“无线和网络设置”,进入“Wi-Fi设置”项目,在新窗口中选择“关闭Wi-Fi”,在完成关闭操作后,重新进入该项目,选择“打开Wi-Fi”,即可重启Wi-Fi连接.
查看Wi-Fi高级设置:有时在问题还未解决的情况下,下面要做的就是进入安卓手机Wi-Fi的高级设置进行相关设置了。    打开手机菜单,进入“设置”窗口,选择“无线和网络”,进入“Wi-Fi设置”,然后进入“高级”选项,进入“代理服务器设置”,确认安卓设备没有使用代理服务器,如果在代理部分发现IP地址或者域名的话,将其删除,即可解决Wi-Fi连接故障
硬件替换法:先更换其他智能手机移动终端测试(Andriod系统手机为最佳),连接相同无线路由器,以确定是否能正常访问网络,该路由器是否支持上网功能;借此来判断不能上wifi的问题所在。


关闭Wi-Fi休眠策略:如果Wi-Fi经常出现问题的话,使用者应该尝试将WiFi休眠策略设置为“从不”,看看问题会不会消失。如果将该策略设置为“从不”的话,耗费的电力将会上升,但是从另外的方面来看,这也会让Wi-Fi连接更稳定。

设置静态IP地址:还有一种解决方法就是为安卓设备设置静态IP地址。这表明用户需要连接的路由器上可能存在DHCP地址分配方面的问题,或者设备获得了错误的地址。为了设置静态IP地址,需要进入静态IP地址设置栏将信息输入进去(IP地址、网关、子网掩码、DNS等项目)。     设置静态IP地址的唯一问题是它将适用于所有的Wi-Fi,因此只有在用户仅仅连接到一张Wi-Fi上的情况时,才能使用这种方法解决问题。

[!--infotagslink--]

相关文章

  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • C#中using的三种用法

    using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using 关键字还用来创建 using 语句 定义一个范围,将在此...2020-06-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
  • Android设置TextView竖着显示实例

    TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • Android 实现钉钉自动打卡功能

    这篇文章主要介绍了Android 实现钉钉自动打卡功能的步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下...2021-03-15
  • Android 开发之布局细节对比:RTL模式

    下面我们来看一篇关于Android 开发之布局细节对比:RTL模式 ,希望这篇文章对各位同学会带来帮助,具体的细节如下介绍。 前言 讲真,好久没写博客了,2016都过了一半了,赶紧...2016-10-02
  • C#简单访问SQLite数据库的方法(安装,连接,查询等)

    这篇文章主要介绍了C#简单访问SQLite数据库的方法,涉及SQLite数据库的下载、安装及使用C#连接、查询SQLIte数据库的相关技巧,需要的朋友可以参考下...2020-06-25
  • iscroll.js 用法介绍

    最新版下载: http://www.csdn123.com/uploadfile/2015/0428/20150428062734485.zip 概要 iScroll 4 这个版本完全重写了iScroll这个框架的原始代码。这个项目的产生...2016-05-19
  • Android中使用SDcard进行文件的读取方法

    首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置: 在AndroidManifest.xml中加入访问SDCard的权限如下: <!--...2016-09-20
  • Android开发之PhoneGap打包及错误解决办法

    下面来给各位简单的介绍一下关于Android开发之PhoneGap打包及错误解决办法,希望碰到此类问题的同学可进入参考一下哦。 在我安装、配置好PhoneGap项目的所有依赖...2016-09-20
  • C++中cin的用法详细

    这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C#中的try catch finally用法分析

    这篇文章主要介绍了C#中的try catch finally用法,以实例形式分析了try catch finally针对错误处理时的不同用法,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25