質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2716閲覧

Swift Realm で 一番初めにアプリを起動する(インストール時に)にコード表を作成する。

sugidodan

総合スコア26

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/12/23 10:48

編集2016/12/25 02:52

iOS, swift3 xcode8 でアプリを作成しています。

例えば、realm のテーブルとして、以下の都道府県コード表をアプリを一番初めに起動する時、もしくはインストール時に作成するにはどうすれば良いでしょうか?

アプリでの利用方法はpickerviewに都道府県名を表示させ、選択した都道府県のコードをrealmに保存することを考えています。

01:北海道
02:青森県
03:岩手県
04:宮城県
....

Realmクラスファイルで「一度だけ実行される関数に定義すれば良い」のが一番楽そうですが
そのような関数を見つけらていません。

あるでしょうか?

次に、コード表のテキストファイルを作成し、
一度だけ、テキストファイルからrealmnに書き込む(インポートする)

この処理はどこのイベントに記述すれば良いでしょうか?

あまり良い方法ではないのかもしれませんが
pickerviewを表示する際に、コード表のテキストファイルを読み込む

ちなみに、Android SQLliteでは、以下のような記述で、所望の処理ができます。これをRealmで実現したい。

簡単に内容を説明すると
sql/以下にCreate文でテーブルを作成したり、Insert文でテーブルに値を挿入するSQL文を記述したファイルを置く。

public class DataBaseOpenHelper extends SQLiteOpenHelper { private static final String DB_NAME = "ScoreBook.db"; private static final int DB_VERSION = 1; private Context m_Context; public DataBaseOpenHelper(Context context ) { super(context, DB_NAME, null, DB_VERSION); // TODO 自動生成されたコンストラクター・スタブ m_Context = context; } @Override public void onCreate(SQLiteDatabase db) { // TODO 自動生成されたメソッド・スタブ try { execSql(db,"sql/create"); } catch (IOException e) { e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO 自動生成されたメソッド・スタブ try { execSql(db,"sql/alter"); } catch (IOException e) { e.printStackTrace(); } onCreate(db); } /** * 引数に指定したassetsフォルダ内のsqlを実行します。 * @param db データベース * @param assetsDir assetsフォルダ内のフォルダのパス * @throws IOException */ private void execSql(SQLiteDatabase db,String assetsDir) throws IOException { AssetManager as = m_Context.getResources().getAssets(); try { String files[] = as.list(assetsDir); for (int i = 0; i < files.length; i++) { String str = readFile(as.open(assetsDir + "/" + files[i])); for (String sql: str.split("/")){ db.execSQL(sql); } } } catch (IOException e) { e.printStackTrace(); } } /** * ファイルから文字列を読み込みます。 * @param is * @return ファイルの文字列 * @throws IOException */ private String readFile(InputStream is) throws IOException{ BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(is,"SJIS")); StringBuilder sb = new StringBuilder(); String str; while((str = br.readLine()) != null){ sb.append(str +"\n"); } return sb.toString(); } finally { if (br != null) br.close(); } } }

sql/以下に置くSQLテキストファイルの例

CREATE TABLE prefecture( _id integer PRIMARY KEY, name text ) INSERT INTO prefecture values (1,"北海道"), (2,"青森県"), (3,"岩手県"), (4,"宮城県"),
class prefecture: object{ dynamic private var id dynamic var name : }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

AppDelegateに、UserDefaultsあたりを使って初回起動済フラグを作ってはどうでしょう。

http://dev.classmethod.jp/smartphone/swift-3-0-userdefaults/

Swift

1@UIApplicationMain 2class AppDelegate: UIResponder, UIApplicationDelegate { 3 4 var window: UIWindow? 5 6 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 7 // 初回起動済フラグが存在しないなら 8 if UserDefaults.standard.object(forKey: "FLAG") != nil) { 9 // フラグをUserDefaultsで作成 10 ... 11 // realmにインサート 12 ... 13 } 14 return true 15 } 16 17・・・ 18}

投稿2016/12/28 05:53

kensii

総合スコア191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sugidodan

2016/12/28 13:33

ありがとうございます。 とりあえず、初回起動済フラグは試していませんが、以下のコードでreamlにオブジェクトを追加、更新できました。 今後、バージョンアップを考慮すると、”マイグレーション”という機能を使ったほうが良いと考えたのですが? ご意見をお聞かせいただけませんでしょうか? ここで、本筋とは外れますが、 Realmのドキュメント( https://realm.io/jp/docs/swift/latest/#section-41 )でも // application(application:didFinishLaunchingWithOptions:)の中に書きます と指示がありますが、 class 側でバージョンアップの処理はしないものなのでしょうか? ここで想定しているバージョンアップの処理は 新しく定義し直したデータモデルとディスクに保存されている古いデータモデルとの整合をとる。 です。 ーーーアプリケーション起動時にRealmのオブジェクトを追加、更新する処理 let realm = try! Realm() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. try! realm.write { realm.create(Prefecture.self,value: ["id": 1 , "name": "北海道"],update: true) realm.create(Prefecture.self,value: ["id": 2 , "name": "青森"],update: true) realm.create(Prefecture.self,value: ["id": 3 , "name": "岩手県"],update: true) } return true }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問