{"id":7584,"date":"2019-08-28T10:00:33","date_gmt":"2019-08-28T01:00:33","guid":{"rendered":"https:\/\/www.gigas-jp.com\/appnews\/?p=7584"},"modified":"2019-09-03T17:27:14","modified_gmt":"2019-09-03T08:27:14","slug":"android%e3%82%a2%e3%83%97%e3%83%aa%e5%86%85%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e3%81%ab%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e4%bf%9d%e5%ad%98%e3%81%99%e3%82%8b","status":"publish","type":"post","link":"https:\/\/www.gigas-jp.com\/appnews\/archives\/7584","title":{"rendered":"Android\u30a2\u30d7\u30ea\u5185\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30c7\u30fc\u30bf\u3092\u4fdd\u5b58\u3059\u308b"},"content":{"rendered":"\n<p>\u30a2\u30d7\u30ea\u5185\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30c7\u30fc\u30bf\u3092\u4fdd\u5b58\u3059\u308b\u5fc5\u8981\u304c\u3042\u3063\u305f\u306e\u3067\u52c9\u5f37\u3092\u517c\u306d\u3066<br><a href=\"\/appnews\/archives\/7405\">\u524d\u56de<\/a>\u4f5c\u6210\u3057\u305f\u65b9\u4f4d\u30a2\u30d7\u30ea\u306e\u89d2\u5ea6\u60c5\u5831\u3092DB\u306b\u4fdd\u5b58\u3059\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002 <\/p>\n\n\n<p><!--more--><\/p>\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"576\" height=\"1024\" src=\"\/appnews\/wp-content\/uploads\/sites\/4\/2019\/08\/02c68df0d50a970635cb1ff2c2235a6e-576x1024.jpg\" alt=\"\" class=\"wp-image-7597\" srcset=\"https:\/\/www.gigas-jp.com\/appnews\/wp-content\/uploads\/sites\/4\/2019\/08\/02c68df0d50a970635cb1ff2c2235a6e-576x1024.jpg 576w, https:\/\/www.gigas-jp.com\/appnews\/wp-content\/uploads\/sites\/4\/2019\/08\/02c68df0d50a970635cb1ff2c2235a6e.jpg 1080w\" sizes=\"(max-width: 576px) 100vw, 576px\" \/><\/figure>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u64cd\u4f5c\u3059\u308b\u305f\u3081\u306eSQLiteOpenHelper\u30af\u30e9\u30b9\u3092\u7d99\u627f\u3057\u305f<br>\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3057\u3001<br>\u5b9a\u6570\u3067\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u540d\u3068\u30d0\u30fc\u30b8\u30e7\u30f3<br>\u30c6\u30fc\u30d6\u30eb\u540d\u3068\u30ab\u30e9\u30e0\u540d<br>DB\u3092\u64cd\u4f5c\u3059\u308b\u305f\u3081\u306eSQL\u6587\u3092\u305d\u308c\u305e\u308c\u5b9a\u7fa9\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>onCreate\u30e1\u30bd\u30c3\u30c9\u5185\u3067SQL\u6587\u3092\u5b9f\u884c\u3057 \u30c6\u30fc\u30d6\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059 \u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class AzimuthLogDB(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) {\n\n    companion object {\n\n        private val DB_VERSION = 1\n        private val DB_NAME = \"azimuthLog.db\"\n\n        private val TABLE_NAME = \"azimuthLog\"\n        private val COLUMN_ID = \"_id\"\n        private val COLUMN_TIMESTUMP = \"timeStump\"\n        private val COLUMN_AZIMUTH = \"azimuth\"\n\n        public val TIME_STUMP = (\"TIMESTUMP\")\n        public val AZIMUTH = (\"AZIMUTH\")\n\n        private val SQL_CREATE_TABLE = String.format(\n            \"CREATE TABLE %s (%s INTEGER PRIMARY KEY AUTOINCREMENT,%s INTEGER,%s REAL)\",\n            TABLE_NAME,\n            COLUMN_ID,\n            COLUMN_TIMESTUMP,\n            COLUMN_AZIMUTH\n        )\n\n        private val SQL_DROP_TABLE = String.format(\"DROP TABLE IF EXISTS %s\", TABLE_NAME)\n\n        private val SQL_SELECT_BETWEEN_TIMESTUMP = String.format(\"%s BETWEEN ? AND ?\", COLUMN_TIMESTUMP)\n    }\n\n    override fun onCreate(db: SQLiteDatabase) {\n        db.execSQL(SQL_CREATE_TABLE)\n    }\n\n    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {\n        onCreate(db)\n    }\n\/\/\/\/<\/code><\/pre>\n\n\n\n<p>\u5f15\u6570\u3067\u53d7\u3051\u53d6\u3063\u305f\u5024\u3092DB\u3078\u4fdd\u5b58\u3059\u308b\u30e1\u30bd\u30c3\u30c9\u3067\u3059\u3002<br>writableDatabase\u3067\u66f8\u304d\u8fbc\u307f\u53ef\u80fd\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u53d7\u3051\u53d6\u308a\u3001\u5909\u6570db\u306b\u4fdd\u5b58<br>\u5b9a\u6570\u3067\u5b9a\u7fa9\u3057\u305f\u30ab\u30e9\u30e0\u540d\u3068\u5bfe\u5fdc\u3059\u308b\u5024\u306e\u30da\u30a2\u3092\u4f5c\u308a<br>\u5909\u6570db\u306b\u4f5c\u6210\u3057\u305f\u5024\u306e\u30da\u30a2\u3092insert\u3057\u3066close\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * DB\u3078\u30c7\u30fc\u30bf\u4fdd\u5b58\n * @param timeStump\n * @param azimuth\n *\/\nfun saveData(timeStump: Long, azimuth: Float) {\n    val db = this.writableDatabase\n    val values = ContentValues()\n    values.put(COLUMN_TIMESTUMP, timeStump)\n    values.put(COLUMN_AZIMUTH, azimuth)\n    db.insert(TABLE_NAME, null, values)\n    db.close()\n}<\/code><\/pre>\n\n\n\n<p> DB\u304b\u3089\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u53d6\u308aJSONObject\u914d\u5217\u3068\u3057\u3066\u8fd4\u3059\u30e1\u30bd\u30c3\u30c9\u3067\u3059\u3002<br>readableDatabase\u3067\u8aad\u307f\u53d6\u308a\u53ef\u80fd\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u53d7\u3051\u53d6\u308a\u3001\u5909\u6570db\u306b\u4fdd\u5b58<br>\u5909\u6570db\u306equery\u30e1\u30bd\u30c3\u30c9\u3067\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u53d6\u3063\u3066\u3044\u307e\u3059\u3002 <br>\u8aad\u307f\u53d6\u3063\u305f\u30c7\u30fc\u30bf\u306fJSONObject\u5316\u3057\u30eb\u30fc\u30d7\u3067\u914d\u5217\u5316\u3057\u3066\u3044\u307e\u3059\u3002  <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * DB\u304b\u3089\u60c5\u5831\u3092\u8aad\u307f\u53d6\u308a\u3001JSONArray\u3068\u3057\u3066\u8fd4\u3059\n * @return\n *\/\nfun loadData(): JSONArray {\n        val db = this.readableDatabase\n        val cursor = db.query(TABLE_NAME, null, null, null, null, null, null, null)\n        val jsonArray = JSONArray()\n        try {\n            while (cursor.moveToNext()) {\n                val jsonObject = JSONObject()\n                jsonObject.put(TIME_STUMP, cursor.getLong(1))\n                jsonObject.put(AZIMUTH, cursor.getFloat(2))\n                jsonArray.put(jsonObject)\n            }\n        } catch (e: JSONException) {\n\n        } finally {\n            db.close()\n        }\n        return jsonArray\n    }<\/code><\/pre>\n\n\n\n<p>\u8aad\u307f\u53d6\u308b\u30c7\u30fc\u30bf\u306e\u7bc4\u56f2\u3092\u7d5e\u308a\u8fbc\u3080\u305f\u3081\u306b\u30c7\u30fc\u30bf\u3092\u4fdd\u5b58\u3057\u305f\u65e5\u6642\u30ab\u30e9\u30e0\u3001timeStump\u3092\u5bfe\u8c61\u306b\u3057\u3066\u3001<br> \u5909\u6570db\u306e query\u30e1\u30bd\u30c3\u30c9\u306e<br>\u7b2c\u4e09\u5f15\u6570\u306bWHERE\u53e5 &#8220;timeStump BETWEEN ? AND ?&#8221;\u3092\u6307\u5b9a\u3057\u3001<br>\u7b2c\u56db\u5f15\u6570\u306bString\u914d\u5217{\u7d5e\u308a\u8fbc\u3080\u7bc4\u56f2\u306e\u521d\u3081, \u7d5e\u308a\u8fbc\u3080\u7bc4\u56f2\u306e\u7d42\u308f\u308a}\u3092\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002<br>\u7b2c\u4e09\u5f15\u6570\u306b\u6307\u5b9a\u3057\u305fSQL WHERE\u53e5 \u306e\u2019?\u2019\u306b\u5bfe\u3057\u3066\u3001\u7b2c\u56db\u5f15\u6570\u306b\u6307\u5b9a\u3057\u305fString\u914d\u5217\u306e\u8981\u7d20\u304c\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u304c\u82e5\u3044\u9806\u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * DB\u304b\u3089\u7d5e\u308a\u8fbc\u307f\u958b\u59cb\u6642\u9593\u3068\u7d42\u4e86\u6642\u9593\u3092\u6307\u5b9a\u3057\u3066\u60c5\u5831\u3092\u8aad\u307f\u53d6\u308a\u3001JSONArray\u3068\u3057\u3066\u8fd4\u3059\n * @param startMilli \u7d5e\u308a\u8fbc\u307f\u6761\u4ef6\u958b\u59cb\u30df\u30ea\u79d2\n * @param endMilli \u7d5e\u308a\u8fbc\u307f\u6761\u4ef6\u7d42\u4e86\u30df\u30ea\u79d2\n * @return\n *\/\nfun loadData(startMilli: Long, endMilli: Long): JSONArray {\n\n        val db = this.readableDatabase\n        val cursor = db.query(\n            TABLE_NAME, null, SQL_SELECT_BETWEEN_TIMESTUMP,\n            arrayOf(startMilli.toString(), endMilli.toString()), null, null, null, null\n        )\n        val jsonArray = JSONArray()\n        try {\n            while (cursor.moveToNext()) {\n                val jsonObject = JSONObject()\n                jsonObject.put(TIME_STUMP, cursor.getLong(1))\n                jsonObject.put(AZIMUTH, cursor.getFloat(2))\n                jsonArray.put(jsonObject)\n            }\n        } catch (e: JSONException) {\n\n        } finally {\n            db.close()\n        }\n        return jsonArray\n    }<\/code><\/pre>\n\n\n\n<p>\u30e1\u30bd\u30c3\u30c9\u306e\u547c\u3073\u51fa\u3057\u5074\u3067\u3059\u3002<br>10\u79d2\u3054\u3068\u306b\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u3068\u6700\u5f8c\u306b\u53d6\u5f97\u3057\u305f\u65b9\u4f4d\u89d2\u3092saveData\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3044\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u4fdd\u5b58\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ 10\u79d2\u3054\u3068\u306b\u6700\u5f8c\u306b\u53d6\u5f97\u3057\u305f\u65b9\u4f4d\u89d2\u3092\u4fdd\u5b58\u3059\u308b\u30eb\u30fc\u30d7\nmSaveAzimuthLog =\n    object : Runnable {\n        override fun run() {\n            val timeStump = GregorianCalendar.getInstance().timeInMillis\n            outputLogger(timeStump, mLastAzimuth)\n            mAzimuthLogDB.saveData(timeStump, mLastAzimuth)\n            mHandler.postDelayed(mSaveAzimuthLog, Util.secToMilli(10))\n        }\n    }\n\/\/ \u4fdd\u5b58\u30eb\u30fc\u30d7\u958b\u59cb\nmHandler.post(mSaveAzimuthLog)<\/code><\/pre>\n\n\n\n<p>\u6c34\u66dc\u62c5\u5f53:Tanaka<\/p>\n<div class='wp_social_bookmarking_light'>\n            <div class=\"wsbl_google_plus_one\"><g:plusone size=\"medium\" annotation=\"none\" href=\"https:\/\/www.gigas-jp.com\/appnews\/archives\/7584\" ><\/g:plusone><\/div>\n            <div class=\"wsbl_hatena_button\"><a href=\"\/\/b.hatena.ne.jp\/entry\/https:\/\/www.gigas-jp.com\/appnews\/archives\/7584\" class=\"hatena-bookmark-button\" data-hatena-bookmark-title=\"Android\u30a2\u30d7\u30ea\u5185\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30c7\u30fc\u30bf\u3092\u4fdd\u5b58\u3059\u308b\" data-hatena-bookmark-layout=\"standard\" title=\"\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af\u306b\u8ffd\u52a0\"> <img src=\"\/\/b.hatena.ne.jp\/images\/entry-button\/button-only@2x.png\" alt=\"\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af\u306b\u8ffd\u52a0\" width=\"20\" height=\"20\" style=\"border: none;\" \/><\/a><script type=\"text\/javascript\" src=\"\/\/b.hatena.ne.jp\/js\/bookmark_button.js\" charset=\"utf-8\" async=\"async\"><\/script><\/div>\n            <div class=\"wsbl_twitter\"><a href=\"https:\/\/twitter.com\/share\" class=\"twitter-share-button\" data-url=\"https:\/\/www.gigas-jp.com\/appnews\/archives\/7584\" data-text=\"Android\u30a2\u30d7\u30ea\u5185\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30c7\u30fc\u30bf\u3092\u4fdd\u5b58\u3059\u308b\" data-via=\"GIGASJAPAN_APPS\" data-lang=\"ja\">Tweet<\/a><\/div>\n            <div class=\"wsbl_facebook_like\"><div id=\"fb-root\"><\/div><fb:like href=\"https:\/\/www.gigas-jp.com\/appnews\/archives\/7584\" layout=\"button_count\" action=\"like\" width=\"100\" share=\"false\" show_faces=\"false\" ><\/fb:like><\/div>\n            <div class=\"wsbl_facebook_send\"><div id=\"fb-root\"><\/div><fb:send href=\"https:\/\/www.gigas-jp.com\/appnews\/archives\/7584\" colorscheme=\"light\" ><\/fb:send><\/div>\n    <\/div>\n<br class='wp_social_bookmarking_light_clear' \/>\n","protected":false},"excerpt":{"rendered":"<p>\u30a2\u30d7\u30ea\u5185\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30c7\u30fc\u30bf\u3092\u4fdd\u5b58\u3059\u308b\u5fc5\u8981\u304c\u3042\u3063\u305f\u306e\u3067\u52c9\u5f37\u3092\u517c\u306d\u3066\u524d\u56de\u4f5c\u6210\u3057\u305f\u65b9\u4f4d\u30a2\u30d7\u30ea\u306e\u89d2\u5ea6\u60c5\u5831\u3092DB\u306b\u4fdd\u5b58\u3059\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002<\/p>\n","protected":false},"author":17,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[119,12],"tags":[],"acf":[],"_links":{"self":[{"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/posts\/7584"}],"collection":[{"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/users\/17"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/comments?post=7584"}],"version-history":[{"count":12,"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/posts\/7584\/revisions"}],"predecessor-version":[{"id":7702,"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/posts\/7584\/revisions\/7702"}],"wp:attachment":[{"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/media?parent=7584"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/categories?post=7584"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gigas-jp.com\/appnews\/wp-json\/wp\/v2\/tags?post=7584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}