chmod失败:android中的EPERM(不允许操作)?

时间:2014-07-18 11:21:46

标签: android android-sqlite

我想在sdcard或外部sdcard中为此创建数据库我已经尝试了这个代码并且使用了这个我已经在sdcard中成功创建了数据库但是在logcat中我给出了如下警告

logcat的

  

07-18 14:18:22.140:W / FileUtils(8595):失败   chmod(/ mnt / sdcard / peakmedia / DB_PMD):libcore.io.ErrnoException:chmod   失败:EPERM(不允许操作)

DB_Helper.java

public class DB_Helper extends SQLiteOpenHelper
{

    public DB_Helper(Context context) 
    {   
        super(context, Environment.getExternalStorageDirectory().getAbsolutePath() 
                       + File.separator + DB_Constant.DB.FILE_DIR 
                       + File.separator + DB_Constant.DB.DATABASENAME, null, DB_Constant.DB.DB_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        String  query=String.format(DB_Constant.CREATE_TABLE_QUERY.CREATE_MYFILES_TABLE);
        db.execSQL(query);


        query=String.format(DB_Constant.CREATE_TABLE_QUERY.CREATE_MYUSERS_TABLE);
        db.execSQL(query);

        query=String.format(DB_Constant.CREATE_TABLE_QUERY.CREATE_MYPLAYLIST_TABLE);
        db.execSQL(query);

        query=String.format(DB_Constant.CREATE_TABLE_QUERY.CREATE_MYDEVICE_TABLE);
        db.execSQL(query);

    }

     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
     {
            if(newVersion > oldVersion)
            {   

                db.execSQL("DROP TABLE IF EXISTS "+ DB_Constant.TABLE.MYFILES);
                onCreate(db);

                db.execSQL("DROP TABLE IF EXISTS "+ DB_Constant.TABLE.MYUSERS);
                onCreate(db);

                db.execSQL("DROP TABLE IF EXISTS "+ DB_Constant.TABLE.MYPLAYLIST);
                onCreate(db);

                db.execSQL("DROP TABLE IF EXISTS "+ DB_Constant.TABLE.MYDEVICE);
                onCreate(db);

            }
     }
}

4 个答案:

答案 0 :(得分:3)

刚刚解决了这个问题。

您必须让您的应用加入linux版本才能授予它SYSTEM权限。

  1. 将此行添加到Android.mk

    LOCAL_CERTIFICATE := platform

  2. 将其添加到AndroidManifest.xml

    的清单节点中

    android:sharedUserId="android.uid.system"

  3. 生成apk并将其推送到/ system / app /

  4. 现在您可以尝试运行

    final String command = "chmod 777 /data/ena";
    Process p = Runtime.getRuntime().exec(command);
    

    File file = new File("/data/ena");
    if (file.exists()) {
        boolean result = file.setExecutable(true);
        Log.e(TAG, "trpb67, RESULT IS " + result);
    }
    

    结果的值应为真

答案 1 :(得分:0)

昨天我遇到了像Mahesh一样的问题(出现相同的警告消息,从SQL服务器向SQLite插入数据,2个表应该在SQLite中接收数据,但只有1个表接收数据,另一个表为空)。

但是今天我尝试再次将数据从SQL服务器插入到SD卡的2个表中,这次,2个表接收数据。

唯一的区别是EMULATOR设置。

放大SD卡空间设置,从几MB到8GB,参考图片。 emulator setting photo

虽然也出现警告,但插入工作成功。

答案 2 :(得分:0)

检查您的设备是否以MTP USB模式连接。有时,之前的MTP模式连接可能会导致此问题。只需重新启动设备并检查它是否有效。

答案 3 :(得分:-1)

您必须更改此文件夹的所有者(chown)。目前,app /您不是要安装db的文件夹的所有者。

所以你必须做一些像

这样的事情
sudo chown -R theuser /mnt/sdcard/peakmedia/DB_PMD