具有不同风格的相同方法的不同数据库库最佳实践?
different Database library with same methods in different flavours Best Practice?
我的 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)
其次是将此 class 与其他一些包装在一起,以导入适当的数据库(聚合,组合,因为 SQLiteDatabase 是最终的):
import android.database.sqlite.SQLiteDatabase;
public class SQLliteDatabaseFlavoured {
SQLiteDatabase sqLiteDatabase;
}
使用情况:
getAll(SQLliteDatabaseFlavoured.SQLiteDatabase conn)
如果您使用 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>")
}
How to replace a string for a buildvariant with gradle in android studio?
如果不是,并且您担心您的应用占用空间,或者您想确保仅在需要时包含密码库,那么您应该选择选项 #2,以便编译器删除未使用的库。选项 1 将始终包括两个库,这是不必要的。此外,选项 #2 为您提供了更大的灵活性,如果您曾经更改实现(另一个 SQLite 产品出现)。
从"best practices"的角度来看,您应该考虑维护和调试。您的第一个选项保证您将确切地知道哪个库导致了问题。否则,必须非常清楚正在使用哪种风格,或者在收到错误报告时总是会为您提供完整的堆栈跟踪。如果您假设这两个库都以完全相同的方式实现,那么如果您得到的只是行号或更少信息的错误,那么您在执行上述任一操作时都会遇到测试噩梦。即使有完整的堆栈跟踪,调试问题也可能很困难,而且对于项目的新手来说肯定不是显而易见的。此外,从最佳实践的角度来看,理想情况下,您根本不会更改这种类型的依赖关系。但我知道这可能是不可能的。
好的,我终于根据@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"
}
}
}
现在每次构建风味时,我都有正确的库。
希望有一天这会对某人有所帮助。
我的 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)
其次是将此 class 与其他一些包装在一起,以导入适当的数据库(聚合,组合,因为 SQLiteDatabase 是最终的):
import android.database.sqlite.SQLiteDatabase;
public class SQLliteDatabaseFlavoured {
SQLiteDatabase sqLiteDatabase;
}
使用情况:
getAll(SQLliteDatabaseFlavoured.SQLiteDatabase conn)
如果您使用 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 将始终包括两个库,这是不必要的。此外,选项 #2 为您提供了更大的灵活性,如果您曾经更改实现(另一个 SQLite 产品出现)。
从"best practices"的角度来看,您应该考虑维护和调试。您的第一个选项保证您将确切地知道哪个库导致了问题。否则,必须非常清楚正在使用哪种风格,或者在收到错误报告时总是会为您提供完整的堆栈跟踪。如果您假设这两个库都以完全相同的方式实现,那么如果您得到的只是行号或更少信息的错误,那么您在执行上述任一操作时都会遇到测试噩梦。即使有完整的堆栈跟踪,调试问题也可能很困难,而且对于项目的新手来说肯定不是显而易见的。此外,从最佳实践的角度来看,理想情况下,您根本不会更改这种类型的依赖关系。但我知道这可能是不可能的。
好的,我终于根据@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"
}
}
}
现在每次构建风味时,我都有正确的库。 希望有一天这会对某人有所帮助。