質問編集履歴

1 コードの挿入で入力しなおしました。

totoro_mini

totoro_mini score 6

2018/08/12 18:19  投稿

android studio 3.1.3 sqlite に画面に表示されているデータを保存しようとするとアプリが停止する
### 前提・実現したいこと
ここに質問の内容を詳しく書いてください。
(例)android studio で緯度経度をもとに地図を表示し、同時にそのデータをSQLITEに保存しようとしています。
地図表示ボタンをクリックすると以下のエラーメッセージが発生しました。
### 発生している問題・エラーメッセージ
アプリが停止しました。
### 該当のソースコード
```android studio  
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
   private double _latitude = 0;
   private double _longitude = 0;
   private TextView _tvLatitude;
   private TextView _tvLongitude;
   private int gyoNo = 0;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       _tvLatitude = findViewById(R.id.tvLatitude);
       _tvLongitude = findViewById(R.id.tvLongitude);
       LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
       GPSLocationListner locationListner = new GPSLocationListner();
       if (ActivityCompat.checkSelfPermission(this, Manifest.permission.
               ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
               String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION};
               ActivityCompat.requestPermissions(MainActivity.this,permissions,1000);
           // TODO: Consider calling
           //   ActivityCompat#requestPermissions
           // here to request the missing permissions, and then overriding
           //  public void onRequestPermissionsResult(int requestCode, String[] permissions,
           //                                         int[] grantResults)
           // to handle the case where the user grants the permission. See the documentation
           // for ActivityCompat#requestPermissions for more details.
           return;
       }
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
               locationListner);
   }
   public void onMapSearchButtonClick(View view) {
       EditText etSearchWord = findViewById(R.id.etSearchWord);
       String searchWord = etSearchWord.getText().toString();
       try {
           searchWord = URLEncoder.encode(searchWord, "UTF-8");
           String uriStr = "geo:0.0?q=" + searchWord;
           Uri uri = Uri.parse(uriStr);
           Intent intent = new Intent(Intent.ACTION_VIEW, uri);
           startActivity(intent);
       }
       catch (UnsupportedEncodingException ex) {
           Log.e("IntentStartAtivity","検索キーワード変換失敗",ex);
       }
   }
   public void onMapShowCurrentButtonClick(View view) {
       gyoNo++;
     // DateFormat df = new SimpleDateFormat("yyyy/MM/dd", Locale.JAPAN);
     // Calendar cl = Calendar.getInstance();
     // cl.setTime(new Date());
    //  String str1 = df.format(cl);
       DbOpenHelper helper = new DbOpenHelper(MainActivity.this);
       SQLiteDatabase db = helper.getWritableDatabase();
   try {
       String sqlInsert = "INSERT INTO MAP_TBL (_id,lati,longi,ichi,note) VALUES (?,?,?,?,?)";
           SQLiteStatement stmt = db.compileStatement(sqlInsert);
           stmt.bindLong(1,gyoNo);
           stmt.bindDouble(2,_latitude);
           stmt.bindDouble(3,_longitude);
           stmt.bindString(4,"---");
           stmt.bindString(5,"--:--");
           stmt.executeInsert();
       }
       finally {
           db.close();
       }
   }
       private class GPSLocationListner implements LocationListener {
       @Override
       public void onLocationChanged(Location location) {
           _latitude = location.getLatitude();
           _longitude = location.getLongitude();
           _tvLatitude.setText(Double.toString(_latitude));
           _tvLongitude.setText(Double.toString(_longitude));
       }
       @Override
       public void onStatusChanged(String provider, int status, Bundle extras) {
       }
       @Override
       public void onProviderEnabled(String provider) {
       }
       @Override
       public void onProviderDisabled(String provider) {
       }
   }
   public void onRequestPermissionsResult(int requestCode,String[] permissions,
                                          int[] grantResults) {
       if(requestCode == 1000 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
           LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
           GPSLocationListner locationListner = new GPSLocationListner();
           if(ActivityCompat.checkSelfPermission(MainActivity.this,
                   Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
               return;
           }
           locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,
                   locationListner);
       }
   }
```  
### 試したこと
ここに問題に対して試したことを記載してください。
public void onMapShowCurrentButtonClick(View view)
でSQLITEへの書き込みの部分はコメントアウトすると正常に動きます。
### 補足情報(FW/ツールのバージョンなど)
androidは3.1.3です。
ここにより詳細な情報を記載してください。
  • SQLite

    1433 questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

  • Android

    10551 questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る