0

我正在尝试使用从 DB40 数据库返回的对象填充 listviewactivity 的列表,但我的应用程序不断崩溃,我不完全确定原因。

如果我知道如何阅读 LogCat 并能够理解它所说的内容,那将会有所帮助 -.- 我可以粗略地理解我只是不知道到底出了什么问题。

public class AndrochieveActivity extends ListActivity { 
private List<Achievement> achieves;

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

    ObjectContainer db = Db4oEmbedded.openFile("achievements.db4o");

    try{
        achieves = db.query(Achievement.class);
    } finally {
        db.close();
    }

    setListAdapter(new ArrayAdapter<Achievement>(this, R.layout.achievelist, achieves) {
        @Override
        public View getView(int pos, View cView, ViewGroup parent) {
            View row = mInflater.inflate(R.layout.achievelist, null);

            TextView title = (TextView) row.findViewById(R.id.title);
            title.setText(getItem(pos).GetTitle());

            TextView desc = (TextView)row.findViewById(R.id.desc);
            desc.setText(getItem(pos).GetDescription());

            TextProgressBar prog = (TextProgressBar)row.findViewById(R.id.prog);
            prog.setProgress(0);
            prog.setMax(getItem(pos).GetMax());

            return row;
        }
    });


}

我没有看到任何本质上会搞砸的事情。如果文件不退出,则 Db4oEmbedded.openFile 应该创建文件,但我在 logcat 中不断收到一堆文件读取错误,如下所示:

11-29 14:21:44.359: D/AndroidRuntime(19396): Shutting down VM
11-29 14:21:44.359: W/dalvikvm(19396): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0)
11-29 14:21:44.389: E/AndroidRuntime(19396): FATAL EXCEPTION: main
11-29 14:21:44.389: E/AndroidRuntime(19396): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.megalon.androchieve/com.megalon.androchieve.AndrochieveActivity}: com.db4o.ext.Db4oIOException: /achievements.db4o (Read-only file system)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1849)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1870)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at android.app.ActivityThread.access$1500(ActivityThread.java:132)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1051)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at android.os.Looper.loop(Looper.java:150)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at android.app.ActivityThread.main(ActivityThread.java:4312)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at java.lang.reflect.Method.invokeNative(Native Method)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at java.lang.reflect.Method.invoke(Method.java:507)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at dalvik.system.NativeStart.main(Native Method)
11-29 14:21:44.389: E/AndroidRuntime(19396): Caused by: com.db4o.ext.Db4oIOException: /achievements.db4o (Read-only file system)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.io.RandomAccessFileFactory.newRandomAccessFile(RandomAccessFileFactory.java:26)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.io.FileStorage$FileBin.<init>(FileStorage.java:43)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.io.FileStorage.open(FileStorage.java:22)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.io.StorageDecorator.open(StorageDecorator.java:27)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.io.CachingStorage.open(CachingStorage.java:52)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.internal.IoAdaptedObjectContainer.openImpl(IoAdaptedObjectContainer.java:57)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.internal.ObjectContainerBase$1.run(ObjectContainerBase.java:140)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.foundation.DynamicVariable.with(DynamicVariable.java:54)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.foundation.Environments.runWith(Environments.java:28)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.internal.ObjectContainerBase.withEnvironment(ObjectContainerBase.java:161)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.internal.ObjectContainerBase.open(ObjectContainerBase.java:131)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.internal.IoAdaptedObjectContainer.<init>(IoAdaptedObjectContainer.java:35)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.internal.ObjectContainerFactory.openObjectContainer(ObjectContainerFactory.java:18)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.Db4oEmbedded.openFile(Db4oEmbedded.java:65)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.Db4oEmbedded.openFile(Db4oEmbedded.java:76)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.megalon.androchieve.AndrochieveActivity.onCreate(AndrochieveActivity.java:45)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1813)
11-29 14:21:44.389: E/AndroidRuntime(19396):    ... 11 more
11-29 14:21:44.389: E/AndroidRuntime(19396): Caused by: java.io.FileNotFoundException: /achievements.db4o (Read-only file system)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:132)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:173)
11-29 14:21:44.389: E/AndroidRuntime(19396):    at com.db4o.io.RandomAccessFileFactory.newRandomAccessFile(RandomAccessFileFactory.java:19)
11-29 14:21:44.389: E/AndroidRuntime(19396):    ... 28 more
11-29 14:21:44.419: D/dalvikvm(19396): GC_CONCURRENT freed 308K, 49% free 2900K/5639K, external 0K/0K, paused 2ms+3ms
11-29 14:21:46.310: D/Process(19396): killProcess, pid=19396
11-29 14:21:46.310: D/Process(19396): dalvik.system.VMStack.getThreadStackTrace(Native Method)
11-29 14:21:46.320: D/Process(19396): java.lang.Thread.getStackTrace(Thread.java:745)
11-29 14:21:46.320: D/Process(19396): android.os.Process.killProcess(Process.java:797)
11-29 14:21:46.320: D/Process(19396): com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:108)
11-29 14:21:46.320: D/Process(19396): java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:854)
4

4 回答 4

1

正如异常所说,它试图在您没有写入权限的地方创建它。

如果文件变大,您可以使用下面的文件getExternalStorageDirectory()以及 WRITE_EXTERNAL_STORAGE 权限。

您应该能够使用上下文和创建应用程序数据目录的完整路径ctx.getDir("data", 0),将文件名附加到该路径,然后将其交给 db4o。

于 2011-11-29T19:43:49.223 回答
0

根据以下情况,似乎Achievement.class可能没有正确设置数据库:

http://tracker.db4o.com/browse/COR-2005;jsessionid=B1CD509911380518AC540A6E75F41529?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aworklog-tabpanel

于 2011-11-29T19:53:13.903 回答
0

看看这段代码(对于 sqlite)

            String currentTimeString = new SimpleDateFormat(
                    "yyyy.MM.dd.'at'.hhaaa").format(new Date());
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File file = new File(Environment.getExternalStorageDirectory(),
                    currentTimeString + ".jpg");
            outputFileUri = Uri.fromFile(file);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
            startActivityForResult(intent, TAKE_PICTURE);

看看我的新文件语句如何给出特定的目录,你也需要这样做。也看这里,因为它是完全相同的问题Getting Access denied试图在ASP.NET项目中读取App_Data中的文件-任何指针? 如果这些都没有帮助,您需要发布 Db4oEmbedded 的代码

哎呀没有意识到那个帖子是 asp.net

于 2011-11-29T21:10:46.213 回答
0

您面临的问题是由于ObjectContainer db = Db4oEmbedded.openFile("achievements.db4o");.

  1. 您正在尝试在您没有权限的根目录中创建数据库文件。因此,在 applicationContext 中创建应用程序可以像其他数据库(SQLite)一样轻松访问数据库的地方,即在 data/data/YOUR_APPLIACTION_PACKAGE_NAME/DATABASENAME 中创建。

  2. 第二件事是不要尝试打开,在 UIThread 中创建数据库文件,因为它会给出 NetworkOnMainThreadException。让它在后台。

有关示例代码,您可以参考这里:https ://github.com/raghav1sharma/BlogSamples

于 2014-12-31T06:29:47.963 回答