安卓数据云端同步(一)生成操作Sqlite记录

同步思想:

先介绍客户端为最新数据的数据同步问题,这种机制常常应用在云笔记,随手记类似的app。

这里我建了一个listview,对listview上item的增删改,来代替实际项目中的情况。

1.对listview 和本地数据表datatable表(使用id作为数据唯一表示)映射,实现增删改。

2.每次将对本地数据表的操作记录在operation表中,在表中记录该操作的时间戳。

3.将operation 表中内容封装成json数据发送给服务器(从服务器获取上次同步时间戳,只提交在这次更新以后的操作)。

4.服务器更新完成,返回success,表示同步成功,在时候可以清空operation表

MainActivity.java

package com.example.sqllitcache;

import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {

	ListView lv;
	Button submit;
	EditText et;
	SQLiteDatabase dbwrite ;
	Dbhelper dbhelper;
	ArrayAdapter <String> adapter;
	ImageButton upload;
	Cursor c;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv=(ListView) findViewById(R.id.listView1);
        submit=(Button) findViewById(R.id.button1);
        upload=(ImageButton) findViewById(R.id.imageButton1);
        et=(EditText) findViewById(R.id.autoCompleteTextView1);
        adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
        lv.setAdapter(adapter);
        dbhelper=new Dbhelper(this);
        dbwrite=dbhelper.getWritableDatabase();
        getData();

        //点击提交
        submit.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				String newData=et.getText().toString();
				addData(newData);
			}
		});

        //点击了同步
        upload.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				getOp();
			}
		});
        //长按列表项,修改数据
        lv.setOnItemLongClickListener(new OnItemLongClickListener() {
			@Override
			public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
					final int position, long arg3) {
				// TODO Auto-generated method stub

				new AlertDialog.Builder(MainActivity.this).setPositiveButton("我确定修改",new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						updateData(position);
					}
				}).show();
				return false;
			}
		});
        //短按列表项删除数据
        lv.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> arg0, View arg1, int position,
					long arg3) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, position+"", 0).show();
				deleteData(position);
			}
		});
    }

    //添加数据的执行函数,添加到本地数据库,并提示更新listtview
    void addData(String newData)
    {

    	//添加到本地数据库
    	ContentValues content=new ContentValues();
    	String putdata=et.getText().toString();
        content.put("data", putdata);
        dbwrite.insert("datatable",null, content);
        //下面将操作保存到operation表
        getData();
        c.moveToLast();
        int id=c.getInt(c.getColumnIndex("_id"));
        ContentValues content2=new ContentValues();
        content2.put("data", putdata);
        content2.put("op", 0);
        content2.put("dataid",id );
        long time=System.currentTimeMillis();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date=new Date(time);
        String formattime=sdf.format(date);
        content2.put("timestamp", formattime);
        dbwrite.insert("operation", null, content2);
    }

    //删除一条数据
    void deleteData(int position)
    {
    	c.moveToPosition(position);
		int id=c.getInt(c.getColumnIndex("_id"));
		dbwrite.delete("datatable", "_id=?",  new String[]{id+""} );
		getData();
		//记录到operation表
		    ContentValues content2=new ContentValues();
	        content2.put("data", "");
	        content2.put("op", 1);
	        content2.put("dataid",id );
	        long time=System.currentTimeMillis();
	        SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
	        Date date=new Date(time);
	        String formattime=sdf.format(date);
	        content2.put("timestamp", formattime);
	        dbwrite.insert("operation", null, content2);

    }
    //修改一条数据
    void updateData(int position)
    {
    	c.moveToPosition(position);
		ContentValues cv=new ContentValues();
		cv.put("data", "changed");
		int id=c.getInt(c.getColumnIndex("_id"));
		dbwrite.update("datatable", cv, "_id=?", new String [] {id+""});
        getData();

        ContentValues content2=new ContentValues();
        content2.put("data", "changed");
        content2.put("op", 2);
        content2.put("dataid",id );
        long time=System.currentTimeMillis();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date=new Date(time);
        String formattime=sdf.format(date);
        content2.put("timestamp", formattime);
        dbwrite.insert("operation", null, content2);
    }
    //获取数据
    void getData()
    {
    	c= dbwrite.query("datatable", null, null, null, null, null, null);
    	adapter.clear();
    	 //读取本地数据库
        while(c.moveToNext())
        {
        	String data=c.getString(c.getColumnIndex("data"));
        	int id=c.getInt(c.getColumnIndex("_id"));
        	adapter.add(data+":"+id);
        	System.out.println(data+": "+id);
        }
        adapter.notifyDataSetChanged();
    }
    //从日志表获得操作记录
    void getOp()
    {
    	c= dbwrite.query("operation", null, null, null, null, null, null);
    	 while(c.moveToNext())
         {
         	String data=c.getString(c.getColumnIndex("data"));
         	int id=c.getInt(c.getColumnIndex("dataid"));
         	int op=c.getInt(c.getColumnIndex("op"));
         	String timestamp=c.getString(c.getColumnIndex("timestamp"));
         	Toast.makeText(MainActivity.this, id+": "+op+"  "+timestamp, 0).show();
         	System.out.println(id+": "+op+"  "+timestamp);
         }
    	 dbwrite.delete("operation", "1", null);
    }
}

Dbhelper.java

package com.example.sqllitcache;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class Dbhelper extends SQLiteOpenHelper {
	public Dbhelper(Context context ) {
		super(context, "mydb",null, 1);
		// TODO Auto-generated constructor stub
	}
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		db.execSQL("CREATE TABLE datatable ("+
		           "_id INTEGER PRIMARY KEY AUTOINCREMENT,"+
		           "data String DEFAULT \"\")"  );
		//创建一个操作表作为日志,dataid为数据项id,opt=0,1,2,3为对数据的增删改查
		db.execSQL("CREATE TABLE operation ("+
		           "_id INTEGER PRIMARY KEY AUTOINCREMENT,"+
				   "dataid INTEGER ,"+
		           "op INTEGER,"+
		           "data String DEFAULT \"\","+
				   "timestamp String"+")");
	}

	@Override
	public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
		// TODO Auto-generated method stub

	}
}
时间: 2024-08-27 12:04:33

安卓数据云端同步(一)生成操作Sqlite记录的相关文章

安卓数据存储(3):SQLite数据库存储

SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级:使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小. 2.独立性:SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”. 3.隔离性:SQLite 数据库中所有的信息(比如表.视图.触发器等)都包含在一个文件夹内,方便管理和维护. 4.跨平台:SQLit

无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.demo1" /> 上面targetPackage指定的包要和应用的package相同. (2)在清单文件中ap

数据存储与访问之——初见SQLite数据库

      本节引言: 本节学习Android数据库存储与访问的第三种方式:SQLite数据库,和其他的SQL数据库不同,我们并不需要在手机上另外安装一个数据库手机软件,Android系统已经集成了这个数据库,我们无需像使用其他数据库软件(Oracle,MSSQL,MySql等)又要安装,然后完成相关配置,又要改端口之类的!       1.基本的概念 1)SQLite是什么?为什么要用SQLite?SQLite有什么特点? 答:下面本姑娘来为大家讲解 SQLite是一个轻量级的关系型数据库,运

Centos RSync+Shell实现数据定时同步

我们前面介绍了几篇关于Centos相关服务安装及配置,今天我们主要介绍如何实现本地与远程计算机的数据目录同步,在我之前bolg中有一篇通过shell实现本地与远程计算机的数据同步的文章,通过shell同步实现指定目录的复制及覆盖操作不是那么的方便,因为复制目录及覆盖目录只会增量,不会减量,比如:原来的本地有一个目录下的abc.txt被同步到了远程计算机的指定目录后,当本地目录下的abc.txt文件删除后,远程计算机同步目录下的abc.txt依然存在,所以这样导致数据信息不准确,今天了我们为了解决

Android——采用SQLiteDatabase操作SQLite数据库

除了能够使用文件或SharedPreferences存储数据.还能够选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类型,尽管它支持的类型仅仅有五种,但实际上sqlite3也接受varchar(n).char(n).decimal(p,s) 等数据类型.仅仅只是在运算或保存时会转成相应的五种数据类型. SQLite最大的特

JDBC访问及操作SQLite数据库

SQLite 是一个开源的嵌入式关系数据库,其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下,只要确保SQLite的二进制文件存在即可开始创建.连接和使用数据库.  SQLite的下载页面:http://www.sqlite.org/download.html window操作系统下载:sqlite-dll-win32-x86-3081002.zip及sqlite-shell-win32-x86-3081002.zi

rsync+inotify实现数据实时同步备份

在实际生产环境当中,我们总会遇见需要把一些重要数据进行备份,且随着应用系统规模的增大,对数据的安全性.可靠性.时效性要求还是比较高的, 因此我自己有在用rsync+inotify来实现数据实时同步备份,下面记录下操作步骤,以防日后自己忘记. 实验背景: 操作系统          IP         机器名        角色 CentOS 7.2       172.16.22.1     nginx01        数据源(服务器端) CentOS 7.2       172.16.22

android操作sqlite数据库及心得

写这篇文章主要是网上的对sqlite的操作太多且太杂,很多时候都不能很好的运用到自己的项目中,结构不清晰,我自己写了一篇适合刚刚接触的人看的操作方法. 近来用android时要将一些数据保存起来,一开始用的是preferences,后来要保存的东西多了,发现用preferences明显不能满足要求了,而且发现用这个的话代码就变得有点乱了,所以才开始学习使用sqlite数据库,一开始以为不就是个数据库么,和平时的mysql啊或者是sqlserver都一样,都很简单的,但后来真正在用的时候才发现困难

Sqlserver2000连接Oracle11G数据库进行数据实时同步

 Sqlserver2000连接Oracle11G数据库进行数据实时同步 1,前提条件 已经有sqlserver2000环境,已经存在oracle11g环境,准备这两个数据库,建立各自的访问账号,两者之间需要ping通,telnet端口也要能通,目的是将sqlserver里面的数据自动同步到oracle数据库里面去.Sqlserver里面有链路服务器(linked server)可以实现. 2,在sqlserver上面建立odbc数据源 有2种方式:"Microsoft ODBC for Ora