【问题标题】:Can i use table column in Sqlite database as a resource variable?我可以使用 Sqlite 数据库中的表列作为资源变量吗?
【发布时间】:2018-11-22 17:10:57
【问题描述】:

我有一些这样的代码

原来:

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 不起作用?它告诉我“无法播放此视频”

【问题讨论】:

    标签: android database sqlite android-studio


    【解决方案1】:

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

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

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

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

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

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

    最后:

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

    编辑 如果您将R.raw.video 作为字符串存储在数据库中,那么这对您没有帮助,因为正如我之前解释的那样,这个完整的字符串没有分配给它的值。

    【讨论】:

    • 我完全按照你说的做了,但是还是不行!!为什么?
    • 我已经确定我从数据库中获得了正确的值,与该资源的名称完全相同,
    • 然后在int id =.....这一行放一个断点,检查你是否得到一个有效的id,然后这行String path = "android.resource://" + getPackageName() + "/" + id;是否有效
    • id变成0
    • 那里变成了 android.resource://getPackageName()/0
    猜你喜欢
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2014-12-09
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多