0

我的 Androdi 应用程序中有两个不同的 falvours,它们应该使用不同的 SQL 实现。一种用途:

android.database.sqlite.SQLiteDatabase

第二:

net.sqlcipher.database.SQLiteDatabase

我有这样的方法:

getAll(SQLiteDatabase conn)

我应该如何解决这种情况以避免复制和粘贴?最好的做法是什么?我有几个想法:第一个(有很多复制粘贴最糟糕的)是提供不同的方法:

 getAll(android.database.sqlite.SQLiteDatabase conn)
 getAll(net.sqlcipher.database.SQLiteDatabase conn)

其次是在导入适当的数据库(聚合,组合,因为 SQLiteDatabase 是最终的)中用其他一些类型包装这个类:

import android.database.sqlite.SQLiteDatabase;
public class SQLliteDatabaseFlavoured   {
     SQLiteDatabase sqLiteDatabase;
}

随着用法:

getAll(SQLliteDatabaseFlavoured.SQLiteDatabase conn)
4

2 回答 2

1

如果您使用的是 Android Studio,则可以使用 gradle buildVariant

flavor1 -> packagename: com.example.flavor1 
flavor2 -> packagename: com.example.flavor2

在你的 gradle 脚本中使用它:

filter{
    String line -> line.replaceAll("<complete line of regular expression>",
                                   "<complete line of modified expression>")
}

如何在android studio中用gradle替换buildvariant的字符串?

如果不是,并且您担心您的应用程序占用空间,或者您想确保仅在需要时包含密码库,那么您应该使用您的选项 #2,以便编译器将删除未使用的库。选项 1 将始终包含两个库,这是不必要的。此外,如果您更改实现(另一个 SQLite 产品出现),选项 #2 会为您提供更大的灵活性。

从“最佳实践”的角度来看,您应该考虑维护和调试。您的第一个选项保证您将确切知道哪个库导致了问题。否则,必须非常清楚正在使用哪种风格,否则当您收到错误报告时,您始终会获得完整的堆栈跟踪。如果您假设两个库都以完全相同的方式实现,那么如果您得到的只是行号或更少信息的错误,那么您将面临执行上述任何一项的测试噩梦。即使有完整的堆栈跟踪,调试问题也可能很困难,而且对于项目的新人来说肯定不是很明显。此外,从最佳实践的角度来看,理想情况下,您根本不会更改这种类型的依赖关系。但我明白这可能是不可能的。

于 2015-11-18T13:40:20.160 回答
0

好的,我终于根据@Jim 的回答找到了解决方案。非常感谢!

它不是最干净的,但它可以工作。我创建了两个任务来复制文件

task copyNoEncryption << { 
//copy to temp folder
copy {
    from("src/com/sql")
    into("src/temp/sql")
}
//copy back to correct folder and replace string's
copy {
    from("src/temp/sql")
    into("src/com/sql")

    filter {
 //you have to remember that first argument is REGEX and second is normal String
        String line ->
            line.replaceAll("before REGEX",
                    "after STRING")
    }
}
//delete temp folder
delete("src/temp")
}

第二个任务类似地工作

task copyEncryption << {
//same body but reverse string swap 
//REMEMBER in replaceAll 1st arg is REGEX and second is String
}

现在我分别在风味之前添加执行这个任务

android.buildTypes.all{ theBuildType ->
tasks.whenTaskAdded{ theTask ->
    if(theTask.name == "generateFlavorWithoutEncryptionr${theBuildType.name.capitalize()}Sources"){
        theTask.dependsOn "copyNoEncryption"
    }
    else if(theTask.name == "generateFlavourWithEncryption${theBuildType.name.capitalize()}Sources"){
        theTask.dependsOn "copyEncryption"
    }
}
}

现在,每次我构建风味时,我都有正确的库。希望有一天这会对某人有所帮助。

于 2015-12-03T19:22:25.673 回答