小编pjv*_*pjv的帖子

Android备份/恢复:如何备份内部数据库?

我已经实现了BackupAgentHelper使用提供FileBackupHelper的备份和恢复我拥有的本机数据库.这是您通常与之一起使用ContentProviders并驻留在其中的数据库/data/data/yourpackage/databases/.

人们会认为这是一个常见的情况.但是,文档不清楚该怎么做:http://developer.android.com/guide/topics/data/backup.html.这些典型的数据库并不BackupHelper专门.因此,我使用了FileBackupHelper,将它指向我在."中的.db文件,在我的/databases/任何数据库操作(例如db.insert)中引入了锁ContentProviders,甚至尝试创建" /databases/"目录,onRestore()因为它在安装后不存在.

我已经SharedPreferences在过去的不同应用程序中成功实现了类似的解决方案.但是,当我在模拟器2.2中测试我的新实现时,我看到正在LocalTransport从日志执行备份,以及正在执行(并onRestore()调用)恢复.然而,db文件本身永远不会被创建.

请注意,这是在安装之后,以及在首次启动应用程序之后,在执行还原之后.除此之外,我的测试策略基于http://developer.android.com/guide/topics/data/backup.html#Testing.

还请注意,我不是在谈论我自己管理的一些sqlite数据库,也不是要备份到SDcard,自己的服务器或其他地方.

我确实在文档中提到有关建议使用自定义的数据库,BackupAgent但它似乎并不相关:

但是,如果需要,可能需要直接扩展BackupAgent:*备份数据库中的数据.如果您在用户重新安装应用程序时有要还原的SQLite数据库,则需要构建一个自定义BackupAgent,在备份操作期间读取相应的数据,然后创建表并在还原操作期间插入数据.

请清楚一点.

如果我真的需要自己完成SQL级别,那么我担心以下主题:

  • 打开数据库和事务.我不知道如何在应用程序的工作流程之外从这样的单例类中关闭它们.

  • 如何通知用户正在进行备份并且数据库已锁定.这可能需要很长时间,所以我可能需要显示进度条.

  • 如何在恢复时执行相同操作.据我了解,恢复可能发生在用户已经开始使用应用程序(并将数据输入数据库)时.所以你不能假定只是恢复备份数据(删除空数据或旧数据).你必须以某种方式加入它,由于id的原因,任何非平凡的数据库都是不可能的.

  • 如何在恢复完成后刷新应用程序,而不会让用户卡在某个 - 现在 - 无法访问的点.

  • 我可以确定数据库是否已在备份或还原时升级?否则,预期的架构可能不匹配.

database android restore database-restore android-backup-service

86
推荐指数
5
解决办法
4万
查看次数

IllegalArgumentException:索引1处的绑定值为null

有谁知道这意味着什么?

12-31 20:55:45.861: ERROR/AndroidRuntime(12478): Caused by: java.lang.IllegalArgumentException: the bind value at index 1 is null
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:234)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.database.sqlite.SQLiteQuery.bindString(SQLiteQuery.java:182)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:48)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:330)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:280)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at net.lp.collectionista.providers.ProductContentProvider.query(ProductContentProvider.java:350)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.content.ContentProvider$Transport.query(ContentProvider.java:163)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.content.ContentResolver.query(ContentResolver.java:245)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at net.lp.collectionista.providers.FacadeContentProvider.query(FacadeContentProvider.java:563)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.content.ContentProvider$Transport.query(ContentProvider.java:163)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at android.content.ContentResolver.query(ContentResolver.java:245)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478):     at net.lp.collectionista.util.ScanAddTask.existsProduct(ScanAddTask.java:164) …
Run Code Online (Sandbox Code Playgroud)

database sqlite android android-contentprovider

65
推荐指数
1
解决办法
5万
查看次数

Android上的Google Analytics

有针对原生Android应用程序的特定官方分析SDK(请注意,我不是在谈论手机应用程序中的网页).此库基本上将页面和事件发送到Google Analytics,您可以在与网站完全相同的仪表板中查看分析.由于我的背景是应用而不是网站,并且由于许多Google Analytics术语似乎特别不适用于原生应用,因此我需要一些指导.请讨论我的评论,在你认为我偏离轨道的地方提供一些说明,最重要的是分享好的经验!

1.页面浏览量

页面大多数可以匹配正在显示的不同活动(和对话框).但是,非全屏活动背后可以看到活动,但只能与顶级活动进行交互.这种分类与"(页面)视图"发生冲突.更新 - >阅读http://android-developers.blogspot.com/2010/12/analytics-for-android-apps.html并接受它.

您还希望每次访问至少有一个页面视图,因此在Application类中放置一个页面视图跟踪器.然而,这不构成窗口或种类.通常,活动将同时打开,因此在该页面上花费的时间将为0.这将影响您的"花费时间"统计信息.这些怎么算?

此外,通过Intents,活动之间存在松散耦合.用户可以像在任何网站上一样,参与任何活动,尽管通常这会涉及恢复他离开的应用程序.这使得活动的层次结构通常非常平坦.而且因为没有涉及网址.使用页面标题中的斜杠有什么意义,比如"/ Home"?所有页面在报告中都会出现在同等级别,因此没有内容明细.

非唯一页面浏览量似乎被视为某种成功指标:访问者多久重新访问该页面.当用户旋转屏幕时,通常会重新创建一个Activity,从而使其成为新的页面视图.这种情况发生了很多.也许一个经过深思熟虑的电话会议可以解决这个问题,或者放几个,我不确定.

如何处理页面浏览量?

2.活动

我会说有两种:

  • 用户事件
  • 发生的事情,通常是上述的间接后果.

后者特别令我头疼.首先,许多事件不再用代码编写,而是通过Intents在逻辑上拼凑在一起.这意味着没有地方可以进行分析调用.您要么必须放弃这种优势,又要采用老式的方式来支持良好的分析,或者只是错过一些事件.

其次,作为开发人员,当用户单击按钮时,您并不是那么感兴趣,而是应该执行应该执行的操作以及结果是什么.似乎没有明确的方法可以将结果数据导入Google Analytics(整数有什么用?我想放入Strings!).

适用于平面页面层次结构的内容也适用于事件类别.您可以执行"垂直"类别(局部,即),但某些代码是"水平"共享的,并且跟踪将平等分享.与Intents机制一样,继承使您很难将跟踪始终放在正确的位置.我无法想象"横向"类别.除非你开始制作非常小的类别,例如所有项目在一个类别中形成相同的菜单,否则我很难掌握这个概念.

最后,你如何处理取消?通常你们都有一个按钮的显式取消机制,以及当按下"后退"按钮离开活动并且没有任何变化时的隐式取消.当按下后退按钮并且ARE发生变化时,后者也适用于"保存".如果不是通过自己完成所有"后退"按钮工作,你怎么会抓住所有这些?

如何处理事件?

3.目标

对于目标类型,我可以选择:URL目的地,网站停留时间和页面/访问.大多数应用都没有引导用户进行"注册完成"或"下订单"页面的漏斗.已经购买了应用(在这种情况下,您希望刺激用户热爱您的应用,以便他可以吸引新的买家)或者通过应用内广告付费.所以URL Destination不是一个非常重要的目标.

现场时间似乎也很麻烦.首先,我对如何衡量它有一些疑问.其次,我不一定希望我的用户在我已经付费的应用中花费大量时间,只需要积极和内容.同样,为什么不提及用户使用您应用的频率?

关于页面/访问我已经提到了屏幕方向更改如何炸毁页面视图编号.

在应用程序中,我最感兴趣的是事件/访问,以衡量用户的参与/活动.如果他正在密切使用该应用程序,那么他一定非常喜欢它吗?

此外,我还有一些小漏斗(虽然不会导致转换)我希望看到简化.在我看来,这些漏斗将以事件而不是页面视图结束,但这似乎是不可能的.

我还可以衡量应用内广告的点击次数,但鉴于"网址目标",我需要将其作为网页浏览量而不是事件进行跟踪.

什么是应用程序的智能目标,以及如何使它们适合Google Analytics?

4.优化

是否有一种智能方法可以手动执行"网站优化工具"为网站执行的操作?最重要的是,我如何跟踪不同的目标网页设计?更新 - >似乎我可以使用自定义变量.更多细节仍然欢迎.

5.流量来源

如果你足够聪明,那么推荐会处理安装时间推荐.但也许我还想获得第三方应用程序将用户发送到我的应用程序以执行某些操作的一些数据(此应用程序可通过Intents实现互操作性).

许多与"流量来源"相关的术语似乎毫无意义,并且无法在AdSense中进行连接.

这些数据的智能用途是什么?

6.访客

在"浏览器功能","网络属性"和"移动"选项卡中,许多事情毫无意义,因为它们对我的大多数离线应用程序没有影响/关系,无论如何都不会使用闪存.只有深入了解,才能获得操作系统版本,这些版本非常重要.我甚至忘了你可以检查哪些Android设备访问过的地方.

这些数据的智能用途是什么?如何使相关信息更加突出?

7.其他

没有页内分析.我必须将我的应用注册为网址(What!?)?

mobile android google-analytics adsense

14
推荐指数
1
解决办法
4100
查看次数

突然执行aapt的错误

我知道有很多这些主题,但似乎没有一个在我的案例中有所帮助,也没有完全描述.最好的类似的是在正确的道路下找不到的.

我的问题是我可以使用Eclipse进行整个晚上的编程,编译和使用我的设备,然后我突然得到"当前项目的错误执行aapt",并且当然没有(正确)生成R.java.然后我重新启动Eclipse,一切都消失了.不过,我平均每天都会看到这一次.

我最近切换到amd64并安装了最新的Android-2.3 SDK和匹配工具.我知道现在有一个platform-tools文件夹,它有一个应该独立运行SDK版本的aapt版本.起初我按照SDK网站上的说明将此目录添加到我的PATH中.我也试过不把它添加到我的路径并制作链接平台/ android-9 /工具,以便每个SDK版本都可以使用它自己的旧版本.毋庸置疑,platform-tools/aapt就在那里并具有正确的权限,我可以随时在命令行上执行它.

当我写错误的xml文件或排序,并适当地得到错误时,我看到一个额外的行,上面写着"aapt:/lib32/libz.so.1:没有可用的版本信息".我正在运行最近的Gentoo linux系统.我已经安装了所有东西以支持amd64上的x86,但是为了确保重新出现了emul-linux-x86-baselibs和zlib.问题依然存在.我确实看到一些页面对某些zlib错误表示恐怖,但我不确定这是否相关.我意识到我不是在参考Ubuntu平台上,但肯定差别不是那么大?

它很可能是aapt中的错误或工具本身.它为什么突然停止工作?我也经历过R.java中的id是不正确的,即简单的findViewById()代码会给出ClassCastExceptions因为混合id一次,然后完美地工作而没有任何变化只是一个"干净的项目",在之后失败了.

最后,我在aapt上运行了一些命令,似乎没有添加任何额外的信息:

#ldd aapt
./aapt: /lib32/libz.so.1: no version information available (required by ./aapt)
 linux-gate.so.1 =>  (0xffffe000)
 librt.so.1 => /lib32/librt.so.1 (0x4f864000)
 libpthread.so.0 => /lib32/libpthread.so.0 (0x4f849000)
 libz.so.1 => /lib32/libz.so.1 (0xf7707000)
 libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/32/libstdc++.so.6 (0x415e9000)
 libm.so.6 => /lib32/libm.so.6 (0x4f876000)
 libgcc_s.so.1 => /lib32/libgcc_s.so.1 (0x4fac6000)
 libc.so.6 => /lib32/libc.so.6 (0x4f5ed000)
 /lib/ld-linux.so.2 (0x4f5ca000)

#file aapt
aapt: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped …
Run Code Online (Sandbox Code Playgroud)

android libz aapt

14
推荐指数
2
解决办法
2万
查看次数

Android生命周期:在onStart()或onResume()中填写活动中的数据?

您是否应该通过光标获取数据并填写屏幕上的数据,例如设置窗口标题,onStart()onResume()

onStart()似乎是合乎逻辑的地方,因为在onStart()活动已经可以显示之后,尽管在后台.值得注意的是,我遇到了托管对话框的问题,这让我重新考虑了这一点.如果用户旋转屏幕,而对话仍然是开放的,onCreateDialog()并且onPrepareDialog()被称为之间 onStart()onResume().如果对话框需要基于您之前需要拥有数据的数据onResume().

如果我是正确的onStart()那么为什么Notepad示例通过这样做给出了一个坏的例子onResume()?请参阅http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html NoteEditor.java第176行(title = mCursor.getString...).

此外,如果我的Activity启动另一个Actvity/Dialog,它会更改我的光标正在跟踪的数据.即使在最简单的情况下,这是否意味着我必须手动更新我之前的屏幕(主要活动中的对话框的监听器),或者我必须注册ContentObserver,因为我不再更新数据onResume()(虽然我当然可以更新两次)?

我知道这是一个基本的问题但是最近的对话令我意外,让我意识到这一点.

lifecycle android dialog onstart onresume

7
推荐指数
1
解决办法
5688
查看次数

在具有非静态片段的布局上有效地使用布局编辑器

随着所有Android开发工具的出色,特别是从版本21开始,图形布局编辑器是一个功能强大的工具,可以对布局进行可视控制,并为每个配置和区域设置片段.我知道,典型Activity的布局XML将包含静态fragment标签,例如,为布局编辑器嵌入了信息tools:layout="@layout/book_collection_view_window_list".

但是,因为我需要Fragments动态替换我的窗口,所以我不能使用静态fragment标记,而是需要提供FrameLayout我可以引用的容器,例如replace().是否有类似的东西tools:layout或者tools:context我可以在这个容器上使用,所以在布局编辑器中不仅仅是黑色的空白,所以我可以利用它给我的设计和验证功能?

android dynamic android-context android-fragments graphical-layout-editor

6
推荐指数
1
解决办法
949
查看次数

未捕获的HierarchyRequestError

我是飞镖和聚合物的初学者.当我在Chrome中运行网络应用时,我得到:

Uncaught HierarchyRequestError: Failed to execute 'appendChild' on 'Node': Nodes of type 'HTML' may not be inserted inside nodes of type '#document'. patches-mdv.js:57
(anonymous function) patches-mdv.js:57
(anonymous function) patches-mdv.js:57
(anonymous function) patches-mdv.js:57
Run Code Online (Sandbox Code Playgroud)

appendChild可能是生成的dart2js代码,即下面的部分:

  Node: {
    "^": "EventTarget;ownerDocument=,text:textContent=",
    remove$0: function(receiver) {
      var t1 = receiver.parentNode;
      if (t1 != null)
        J._removeChild$1$x(t1, receiver);
    },
    toString$0: function(receiver) {
      var t1 = receiver.nodeValue;
      return t1 == null ? J.Interceptor.prototype.toString$0.call(this, receiver) : t1;
    },
    append$1: function(receiver, newChild) {
      return receiver.appendChild(newChild);
    },
    insertBefore$2: function(receiver, newChild, refChild) { …
Run Code Online (Sandbox Code Playgroud)

dart dart-polymer

4
推荐指数
1
解决办法
1927
查看次数

如何在重新安装/更新时阻止外部存储上的数据被删除?

我注意到我的应用程序在外部存储(即SD卡)上的数据在"adb install -r"期间被删除.虽然这对于卸载是正常的(然后安装后可选择注意它),但我不明白为什么重新安装这种情况(因此也适用于市场更新).我本可以发誓这并非总是如此.

参考http://developer.android.com/guide/topics/data/data-storage.html#filesExternal我在Android 2.2上专门使用"访问外部存储上的文件",但没有"保存应该共享的文件"或"保存缓存文件".所以我在"/ sdcard/Android/data // files/somefolder/data"中编写和读取数据.我的喜好确实坚持.

@Commonsware:问题不在于getExternalFilesDir()恕我直言,因为我看到我的数据写在我期望的地方.它只是不坚持.我正在使用ao:

public static File getDefaultDirectory(Context context, String packageName) {
    File dir;
    if(mActivity_getExternalFilesDir!=null){//API >=8
        dir = invokeGetExternalFilesDir(context, "fortune");
    }else if(mEnvironment_getExternalStorageDirectory!=null){//API <=7
        dir = invokeGetExternalStorageDirectory();
        dir = new File(dir.getPath() + "/Android/data/" + packageName + "/files/");
    }else{
        //should never occur
        return null;
    }
    return dir;
}
Run Code Online (Sandbox Code Playgroud)

android

3
推荐指数
1
解决办法
999
查看次数

Android UI:TransitionDrawable

在代码中使用 TransitionDrawable 的预期方式是什么?有什么例子吗?

我制作了一个小型测试应用程序来奠定一些背景:

public class SkeletonActivity extends Activity {
    private Button b;
    private ImageView iv;
    private TransitionDrawable transition;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Inflate our UI from its XML layout description.
        setContentView(R.layout.skeleton_activity);

        // Hook up button presses to the appropriate event handler.
        b = ((Button) findViewById(R.id.button));
        b.setOnClickListener(mButtonListener);
        iv = ((ImageView) findViewById(R.id.image));

        //XML-based code
        transition = (TransitionDrawable)getResources().getDrawable(R.drawable.trans).mutate();
        transition.setDrawableByLayerId(transition.getId(0), getResources().getDrawable(R.drawable.trans3));
        transition.setDrawableByLayerId(transition.getId(1), getResources().getDrawable(R.drawable.trans4));

        //Pure programmatic code
        transition = new TransitionDrawable(new Drawable[] {getResources().getDrawable(R.drawable.trans3), getResources().getDrawable(R.drawable.trans4)});

        transition.setCrossFadeEnabled(true);
    }

    OnClickListener mButtonListener = new …
Run Code Online (Sandbox Code Playgroud)

user-interface android transition

3
推荐指数
1
解决办法
7101
查看次数