Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android数据库的最佳实践_Android_Database_Sqlite - Fatal编程技术网

Android数据库的最佳实践

Android数据库的最佳实践,android,database,sqlite,Android,Database,Sqlite,我的Android应用程序需要一个本地数据库。哪种方式最好?我使用的是哪个类sub、subclass、reimplement等等。我在网上找到了太多信息,但我仍然不知道哪些是最佳实践。SQLite将是答案 链接:哪种方式最好? 您需要使用Android附带的SQLite。每个安卓应用程序都可以有自己的数据库 我使用哪个类子类,子类,重新实现, 您需要扩展SQLiteOpenHelper类,该类确定数据库的名称、升级/降级方式、表的结构等。它还定义了获取数据库引用的方法 是的,很多资源都存在,而不

我的Android应用程序需要一个本地数据库。哪种方式最好?我使用的是哪个类sub、subclass、reimplement等等。我在网上找到了太多信息,但我仍然不知道哪些是最佳实践。

SQLite将是答案


链接:

哪种方式最好?

您需要使用Android附带的
SQLite
。每个安卓应用程序都可以有自己的数据库

我使用哪个类子类,子类,重新实现,

您需要扩展
SQLiteOpenHelper
类,该类确定数据库的名称、升级/降级方式、表的结构等。它还定义了获取数据库引用的方法

是的,很多资源都存在,而不是大脑友好型和高质量的资源。以下是一些我喜欢的:


至于你问题的标题,我能说的是,所有适用于SQL数据库的最佳实践都适用于这里,比如规范化等等,这是一个相当广泛的问题,取决于你的经验和使用水平

但通常的做法是创建自己的数据库,这将抽象对数据库的访问。这样,您可以使用
Uri
执行选择/更新/删除/插入查询

对于SQLite数据库本身,用于抽象SQLite数据库的创建和升级。这将允许您轻松地升级数据库,而不会让用户丢失其所有数据

我可以附上一段代码,我在我的一个老项目中使用过,它可以让你开始。但实现整个过程可能超出了单个问题/答案的范围

public class MyServiceProvider extends ContentProvider {
    private SQLiteDatabase db;

    @Override
    public boolean onCreate() {
        // Initialize the database and assign it to the private variable
        MyDatabaseHelper sqlHelper = new MyDatabaseHelper(getContext());
        db = sqlHelper.getReadableDatabase();

        return (db == null)?false:true;
    }

    @override
    Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        // handle the query here, form it, do your checks and then access the DB
        db.query(....);
    }
}

class MyDatabaseHelper extends SQLiteOpenHelper {
    private static final String LOG_TAG = "MyAppTag";
    private static final String DB_NAME = "Databasename";
    private static final String TABLE_NAME = "Tablename";
    private static final int DATABASE_VERSION = 2;
    public static MyServiceProvider.CONTENT_URI = Uri.parse("content://com.mycompany.myApp.MyAppService/myTableOrIdentifier");

    public MyDatabaseHelper(Context context){
        super(context, DB_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE IF NOT EXISTS ....";
        db.execSQL(sql);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Here you can perform updates when the database structure changes
        // Begin transaction
        db.beginTransaction();

        try {
            if(oldVersion<2){
                // Upgrade database structure from Version 1 to 2
                String alterTable = "ALTER ....";

                db.execSQL(alterTable);
                Log.i(LOG_TAG,"Successfully upgraded to Version 2");
            }
            // This allows you to upgrade from any version to the next most 
            // recent one in multiple steps as you don't know if the user has
            // skipped any of the previous updates
            if(oldVersion<3){
                // Upgrade database structure from Version 2 to 3
                String alterTable = "ALTER ....";

                db.execSQL(alterTable);
                Log.i(LOG_TAG,"Successfully upgraded to Version 3");
            }

            // Only when this code is executed, the changes will be applied 
            // to the database
            db.setTransactionSuccessful();
        } catch(Exception ex){
            ex.printStackTrace();
        } finally {
            // Ends transaction
            // If there was an error, the database won't be altered
            db.endTransaction();
        }
    }
}
这将返回一个您可以遍历并获得结果的列表。这也是Android中大多数东西的实现方式(即通过Uri和游标从通讯簿获取地址)

编辑: 我意识到链接很难通过代码高亮显示看到。这里是你需要的重要课程的链接

编辑2:
另外,如果您使用多个表,也是一个重要的源文件

我想使用SQLite数据库的最佳方法是使用ContentProviders。当您搜索它时,您将看到ContentProviderAPI非常复杂。但是有一个非常好的库,它使这个过程实际上非常容易。它被称为ProviGen,您可以在下面的链接中找到有关它的详细信息


它很容易使用。您只需创建一个契约类,在该类中,您将使用注释指示数据库中需要哪些列,它将自动创建所有内容。我甚至可以在一个数据库中创建多个表。

我认为最好的做法是使用一个框架,它将为您完成大部分工作。我个人更喜欢使用数据库时的ORM映射,所以我建议尝试一些ORM框架。我所知道的最好的是。作者还回答了一些问题,这些问题可能非常有用

但如果您不想使用它,您应该先阅读以下文章:


    • +1表示
      ContentProvider
      s。但我不同意它们是复杂的。一旦你得到它一旦它是相当简单的。它只需要多一点代码就可以开始了,但这对大多数模式都是有效的。MVVM/MVC模式一开始也需要相当多的代码,但它们是有效的模式,以后易于维护。当您的SQLite数据库中有2或3个表与ContentProvider绑定时,事情会变得更加复杂。ProviGen自动完成。谢谢。你能给我举一个如何声明contentResolver对象的例子吗?很简单
      getContentResolver()
      是一种
      Context
      的方法,它派生自
      Activity
      (实际上
      Activity
      派生自
      ContextThemeWrapper
      ,它派生自
      Context
      )。因此,一个简单的
      ContentResolver ContentResolver=getContentResolver()就可以了
      
      ContentResolver contentResolver = getContentResolver();
      ...
      Cursor c = contentResolver.query(
              // The Uri results in content://com.mycompany.myApp.MyAppService/myTableOrIdentifier/someId
              Uri.withAppendedPath(MyServiceProvider.CONTENT_URI, someId),
              new String[] {
                  // only get fields we need!
                  "MyDbFieldIneed"
              },
              null, null, null);