不同的数据库库有不同口味的相同方法最佳实践?

时间:2015-11-18 13:11:49

标签: java android sqlite sqlcipher-android

我的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)

2 个答案:

答案 0 :(得分: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>")
}

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

现在,每当我建立味道时,我都有正确的库。 希望有一天这会帮助别人。