【问题标题】:db4o on Honeycomb Db4oException: File format incompatibledb4o on Honeycomb Db4oException:文件格式不兼容
【发布时间】:2011-08-16 21:12:34
【问题描述】:

我在一个小项目中使用 db4o,该项目在 Android 2.2、2.3 等上运行良好。然而,在 Honeycomb 上,数据库初始化会导致以下错误:

com.db4o.ext.Db4oException: File format incompatible: '/data/data/com.myapp/app_data/my_app.db4o'

此强制关闭并且错误发生在运行 Honeycomb 的 Xoom 和运行 Honeycomb 的 Galaxy Tab 上。

相关代码为:

public ObjectContainer db() {
    // Create, open, and close the database
    try {
        if (oc == null || oc.ext().isClosed()) {
            oc = Db4oEmbedded
                    .openFile(dbConfig(), db4oDBFullPath(mContext));
        }
        return oc;
    } catch (Exception e) {
        Log.e(CFAApplication.TAG, e.toString());
        return null;
    }
}

private String db4oDBFullPath(Context ctx) {
    // Returns the path for the database location
    return ctx.getDir("data", 2) + "/" + "myapp.db4o";
}

public List<MyItem> getListItem(final String passedItemTitle) {
    List<MyItem> result = db().query(new Predicate<MyItem>() { // Error occurs here
        public boolean match(MyItem listItem) {
            if (passedItemTitle.equals(listItem.getTitle())) {
                return true;
            }
            return false;
        }
    });
    return result;
}

Honeycomb 处理其外部文件系统的方式有什么不同吗?我可以在 db4oDBFullPath() 方法中进行任何更改以使两者兼容吗?我真的不知道发生了什么不同的事情。也许我需要启用一些 Honeycomb 特定的权限?

【问题讨论】:

  • 这是您在同一系统中创建的文件,还是来自其他地方的文件(例如,可能是不同的 db4o 版本)?
  • 它是由程序动态创建的,而不是从其他地方导入的。
  • 只是为了确定:这个目录是否存在?名字中真的应该有两个data吗?

标签: android android-manifest android-3.0-honeycomb db4o


【解决方案1】:
【解决方案2】:

我在 Xoom 上看到了类似的东西。结果证明文件创建出错了,因为 Xoom 在严格模式下运行,而严格模式阻止了 DB4o 打电话回家。留下损坏的存根数据库。尝试在 AsyncTask 中执行初始 Db4oEmbedded.openFile。

当然是在删除损坏的文件之后。

【讨论】:

    【解决方案3】:
    com.db4o.ext.Db4oException: File format incompatible
    

    当我在 AndroidManifest.xml 中包含下一行时消失:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />;
    

    值得一提的是,我另外编写了用于在单独线程中处理 db4o 的代码...

    所以代码看起来像:

    package com.inbytebg;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import com.db4o.Db4oEmbedded;
    import com.db4o.ObjectContainer;
    import com.db4o.ObjectSet;
    import com.inbytebg.entities.Customer;
    
    public class MainActivity8 extends Activity {
    
        Button savetodb4o;
        Button readfromdb4o;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            savetodb4o = (Button) findViewById(R.id.save_to_db4o);
            savetodb4o.setOnClickListener(new View.OnClickListener() {
    
                public void onClick(View arg0) {
    
                    new Thread() {
    
                        @Override
                        public void run() {
                            String dbPath = getApplicationContext().getDir("data", 0) + "/" + "customer.db4o";
                            ObjectContainer db = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), dbPath);
    
                            Customer cust = new Customer();
                            cust.setId(1);
                            cust.setName("stancho stanchev");
                            cust.setAddress("razgrad");
    
                            try {
                                db.store(cust);
                                Log.i("db4o...", "customer stored...");
                            } finally {
                                db.close();
                            }
                        }
                    }.start();
                }
            });
    
    
            readfromdb4o = (Button) findViewById(R.id.read_from_db4o);
            readfromdb4o.setOnClickListener(new View.OnClickListener() {
    
                public void onClick(View arg0) {
    
                    String dbPath = getApplicationContext().getDir("data", 0) + "/" + "customer.db4o";
                    ObjectContainer db = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), dbPath);
    
                    ObjectSet result;
    
                    try {
    
                        result = db.queryByExample(Customer.class);
    
                        while (result.hasNext()) {
                            Customer customer = (Customer) result.next();
                            Log.i("db4o retrieve:...",
                                    "Name: " + customer.getName()
                                    + " id: " + customer.getId()
                                    + " address: " + customer.getAddress());
                        }
                    } finally {
                        db.close();
                    }
    
    
                }
            });
        }
    }
    

    AndroidManifest.xml 是:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.inbytebg"
          android:versionCode="1"
          android:versionName="1.0">
    
        <uses-sdk android:minSdkVersion="11" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
        <application android:label="@string/app_name" android:icon="@drawable/icon">
            <activity android:name="MainActivity8"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    

    调试输出是:

    D/dalvikvm( 2231): GC_CONCURRENT freed 538K, 9% free 6705K/7367K, paused 7ms+14ms
    
    I/db4o... ( 2231): customer stored...
    
    I/db4o retrieve:...( 2231): Name: stancho stanchev id: 1 address: razgrad
    
    I/db4o retrieve:...( 2231): Name: stancho stanchev id: 1 address: razgrad
    
    I/db4o retrieve:...( 2231): Name: stancho stanchev id: 1 address: razgrad
    
    I/db4o retrieve:...( 2231): Name: stancho stanchev id: 1 address: razgrad
    
    I/db4o retrieve:...( 2231): Name: stancho stanchev id: 1 address: razgrad
    

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      相关资源
      最近更新 更多