首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主同步数据库

主同步数据库
EN

Stack Overflow用户
提问于 2013-09-30 13:31:15
回答 1查看 190关注 0票数 2

嗨,我同步我的数据库与服务器上的任何增量的值点击一个按钮。以下是检查所有值并插入数据的代码,但从android的角度来看,是否有任何优化的技术来进行同步

代码语言:javascript
复制
//new fields

    public void updatenewfileds(ArrayList<String> s) {

        ArrayList<String> da = new ArrayList<String>();

        try {
            String manu = "select MANUFACTURERID from ManufacturerDesc";
            Cursor cc = mDb.rawQuery(manu,null);

            Log.d("Cursor count", "Count =" + cc.getCount());
            if (cc != null && cc.getCount() > 0) {
                if (cc.moveToFirst());
                do {
                    da.add(cc.getString(cc.getColumnIndex("MANUFACTURERID")));
                    System.out.println("here got all alreday avilable ids"+ cc.getString(cc.getColumnIndex("MANUFACTURERID")));
                } while (cc.moveToNext());
                cc.close();
            } else {
                cc.close();
            }
            // need to add only missing data
            for(int i = 0; i<da.size(); i++){               
                boolean flag = false;
                System.out.println(flag);
                for(int j=0; j<i; j++){
                    if(da.get(i).equals(s.get(i*2))){
                        flag = true;
                        break;
                    }
                }

            if(flag  == false){
            String sql = "insert into ManufacturerDesc values('"+ s.get(i*2)+"','"+ s.get(i*2+1)+"');";
            System.out.println("item inserted into db"+ s.get(i*2) +"******" + s.get(i*2+1) );
            mDb.execSQL(sql);
            }
            }

        } catch (SQLException mSQLException) {
            Log.e(TAG, "getTestData >>" + mSQLException.toString());

            throw mSQLException;
        }

    }
EN

回答 1

Stack Overflow用户

发布于 2013-09-30 14:27:36

这将是我的建议,[]只是为了强调,因为我可能会回到它:

  • 设计您的安卓数据库表,如:{ _id,server_id,..你的数据。}在服务器上的所有表上添加上次同步时间戳添加time_changed timestamp.
  • Whenever您的设备与服务器同步,服务器应另外发送一个上次同步时间戳,例如System.currentTimeMilliseconds() (允许服务器这样做,以避免依赖同步时钟)。此时间戳存储在android设备上,并在请求新同步时使用。
  • 当服务器接收到同步请求时,所存储的上次同步时间戳再次从设备传递到服务器。现在,一个简单的查询就可以提取自时间戳以来添加的所有相关数据(减去一些常量以确保获得所有数据)。例如,SELECT * FROM Mydata WHERE (time_changed > (last_sync- 5000 ));5000表示5秒。
  • 现在当您从服务器接收数据时,请记住添加server_id,它只是来自服务器的自动递增的_id。这使您能够推断收到的某些行是否已知(很可能是上面的负5秒)。
  • 该推断是设备上的一个简单查询,例如:我是否已经有一行包含server_id,如果不是,我们添加它,如果是,则跳过它。

使用这种方法,您可以避免随着时间的推移发送越来越多的信息,因为您只发送在最后一次同步之后更改的行(加上更多)。

如果在服务器上编辑行,只需再次更新time_changed以反映所做的编辑。则它将在下一次同步期间被自动包括并覆盖在设备上。

如果你打算在android设备上进行大量的数据库操作,我建议你试试MotoDev,它可以插入到eclipse中,并且有一些不错的数据库功能。包括数据库透视图和ContentProviders的自动生成(用于简化数据库操作的漂亮类)。

提供完整的解释或指南来完成所有这些都超出了本答案的范围。它应该只是给你一个如何做的想法,如果你想改善你的同步过程,你现在有一些指导。

将机制视为数据库上的自动增量和时间戳,在interwebz上有很多例子可以找到。

快乐编码:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19087041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档