具有不同风格的相同方法的不同数据库库最佳实践?

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"
    }
}
}

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