我可以使用Sqlite数据库中的表列作为资源变量吗?

时间:2018-11-22 17:10:58

标签: android database sqlite android-studio

我有一些这样的代码

原本:

String path = "android.resource://" + getPackageName() + "/" + R.raw.video;

        videoView.setVideoURI(Uri.parse(path));

        videoView.requestFocus();
        videoView.start();

videoView完美运行。

然后我将代码更改为

String path = "android.resource://" + getPackageName() + "/" + Dbhelper.COLUMN_Path;

        videoView.setVideoURI(Uri.parse(path));

        videoView.requestFocus();
        videoView.start();

我将“ R.raw.video”存储到数据库中的COLUMN.Path中。有用。但是为什么videoView不起作用?它告诉我“不能播放此视频”

1 个答案:

答案 0 :(得分:0)

如果您存储R.raw.video的整数值,那么这是一个整数,系统在编译项目时会为其分配此资源视频文件。
我相信您在运行时检索了它并将其保存到数据库。
只要您使用在编译时构建的apk,此整数值就有效。

但是,如果您进行了任何更改(尤其是对资源)并重新编译,则不能保证该值仍然有效并与该资源相对应,因为可能会为资源值重新分配新的值。
所以你的方法是错误的。

解决此问题的一种方法是在数据库中存储资源的字符串“名称”,即:"video"(不是完全限定的R.raw.video)。
现在,当您要从raw文件夹中检索文件时,
在将值从db获取到videoName之类的变量后,请执行以下操作:

int id = getResources().getIdentifier(videoName, "raw", getPackageName());

这是检索位于videoName文件夹中的名为raw的资源的整数ID的方法。
如果您的代码不在活动中,则需要提供有效的Context,如下所示:

int id = context.getResources().getIdentifier(videoName, "raw", context.getPackageName());

最后:

String path = "android.resource://" + getPackageName() + "/" + id;

修改 如果您将R.raw.video作为字符串存储在db中,那么这将无济于事,因为这个完整的字符串没有分配值,正如我之前所解释的。