我的Androdi应用程序中有两个不同的falvours应该使用不同的SQL实现。一用:
android.database.sqlite.SQLiteDatabase
和第二:
net.sqlcipher.database.SQLiteDatabase
我有类似的方法:
getAll(SQLiteDatabase conn)
我应该如何解决这种情况以避免复制和粘贴?什么是最好的实践? 我的想法很少: 第一个(最糟糕的是有大量的copypaste)是提供不同的方法:
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)
答案 0 :(得分:1)
如果您使用的是Android Studio
,则可以使用gradle buildVariantflavor1 -> 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>")
}
How to replace a string for a buildvariant with gradle in android studio?
如果没有,并且您担心应用程序占用空间,或者您希望确保仅在需要时包含密码库,那么您应该使用选项#2,以便编译器将删除未使用的库。选项1将始终包含两个库,这是不必要的。此外,如果您更改实现(另一个sqlite产品出现),选项#2可以为您提供更大的灵活性。
从“最佳实践”的角度来看,您应该考虑维护和调试。您的第一个选项可确保您确切知道哪个库导致了问题。否则,必须非常清楚使用哪种风味,或者在收到错误报告时始终提供完整的堆栈跟踪。如果你假设两个库都以完全相同的方式实现,那么如果你得到的只是一个行号或更少信息的错误,你就会做上述任何一个测试噩梦。即使有完整的堆栈跟踪,也可能很难调试问题,对于项目中的新人来说当然不是很明显。此外,从最佳实践的角度来看,理想情况下,您根本不会改变这种类型的依赖关系。但我明白这可能是不可能的。
答案 1 :(得分: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"
}
}
}
现在,每当我建立味道时,我都有正确的库。 希望有一天这会帮助别人。