首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用初始数据创建和引导数据库

使用初始数据创建和引导数据库
EN

Stack Overflow用户
提问于 2015-10-27 21:29:26
回答 2查看 52关注 0票数 0

在启动应用程序时,如果数据库不存在,我需要创建一个db,并将一些初始数据存储到其中。我怎么能这么做?

我知道我应该使用SQLiteOpenHelper类,但是还没有找到一个示例,如果它不存在,它就会创建一个锐钛矿型,并使用初始数据引导它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-27 21:39:26

还没有找到一个示例,如果不存在,它就会创建一个锐钛矿,并使用初始数据引导它。

您看到的关于SQLiteOpenHelper的每个示例都会创建一个数据库,如果它不存在的话。这是拥有SQLiteOpenHelper的一半意义(另一半是在模式需要更改时协助数据库迁移)。实际的数据库创建本身由SQLiteOpenHelper处理。您只需要覆盖onCreate()并创建您的模式(如果相关,还需要用初学者数据填充表)。

例如,在这个示例应用程序中,我有一个SQLiteOpenHelper子类,它就是这样做的:

代码语言:javascript
运行
复制
/***
  Copyright (c) 2008-2012 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain   a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  From _The Busy Coder's Guide to Android Development_
    https://commonsware.com/Android
 */

package com.commonsware.android.constants;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.hardware.SensorManager;

public class DatabaseHelper extends SQLiteOpenHelper {
  private static final String DATABASE_NAME="constants.db";
  private static final int SCHEMA=1;
  static final String TITLE="title";
  static final String VALUE="value";
  static final String TABLE="constants";

  public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, SCHEMA);
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE constants (title TEXT, value REAL);");

    ContentValues cv=new ContentValues();

    cv.put(TITLE, "Gravity, Death Star I");
    cv.put(VALUE, SensorManager.GRAVITY_DEATH_STAR_I);
    db.insert(TABLE, TITLE, cv);

    cv.put(TITLE, "Gravity, Earth");
    cv.put(VALUE, SensorManager.GRAVITY_EARTH);
    db.insert(TABLE, TITLE, cv);

    cv.put(TITLE, "Gravity, Jupiter");
    cv.put(VALUE, SensorManager.GRAVITY_JUPITER);
    db.insert(TABLE, TITLE, cv);

    cv.put(TITLE, "Gravity, Mars");
    cv.put(VALUE, SensorManager.GRAVITY_MARS);
    db.insert(TABLE, TITLE, cv);

    cv.put(TITLE, "Gravity, Mercury");
    cv.put(VALUE, SensorManager.GRAVITY_MERCURY);
    db.insert(TABLE, TITLE, cv);

    cv.put(TITLE, "Gravity, Moon");
    cv.put(VALUE, SensorManager.GRAVITY_MOON);
    db.insert(TABLE, TITLE, cv);

    cv.put(TITLE, "Gravity, Neptune");
    cv.put(VALUE, SensorManager.GRAVITY_NEPTUNE);
    db.insert(TABLE, TITLE, cv);

    cv.put(TITLE, "Gravity, Pluto");
    cv.put(VALUE, SensorManager.GRAVITY_PLUTO);
    db.insert(TABLE, TITLE, cv);

    cv.put(TITLE, "Gravity, Saturn");
    cv.put(VALUE, SensorManager.GRAVITY_SATURN);
    db.insert(TABLE, TITLE, cv);

    cv.put(TITLE, "Gravity, Sun");
    cv.put(VALUE, SensorManager.GRAVITY_SUN);
    db.insert(TABLE, TITLE, cv);

    cv.put(TITLE, "Gravity, The Island");
    cv.put(VALUE, SensorManager.GRAVITY_THE_ISLAND);
    db.insert(TABLE, TITLE, cv);

    cv.put(TITLE, "Gravity, Uranus");
    cv.put(VALUE, SensorManager.GRAVITY_URANUS);
    db.insert(TABLE, TITLE, cv);

    cv.put(TITLE, "Gravity, Venus");
    cv.put(VALUE, SensorManager.GRAVITY_VENUS);
    db.insert(TABLE, TITLE, cv);
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion,
                        int newVersion) {
    throw new RuntimeException("How did we get here?");
  }
}
票数 1
EN

Stack Overflow用户

发布于 2015-10-27 21:38:57

我会这样做的:

  • 首先,我不会使用SQLiteOpenHelper,因为它太复杂了。使用像DBFlow这样的ORM数据库。它非常容易学习和使用。
  • 其次,我将扩展App类,并在其中放置一个代码,该代码读取一个共享首选项值,您可以使用该值作为标志来确定它是否是应用程序的第一个开始。基本上,如果它根本不存在于共享的prefs中,那么您可以假设它是第一个开始,并且可以运行一个函数来填充数据库。不要忘记在此点将此标志存储在共享prefs中。

在下一个应用程序运行中,由于标志将出现,初始化函数将被跳过。

您可以将App类看作是在每个活动之前启动的东西。它不是一个项目所需的类,但是要进行这种初始化,它是放置它们的正确位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33378816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档