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

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

ただいまの
回答率

89.13%

Cursor cは、nullではないが、whileでは、falseとなります。

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,379

edoooooo

score 162

下記の結果が出たため、cは、nullではないということから、selectは、できていると考えるのですが、whileでは、falseが返されます。なぜでしょうか?
アドバイスをいただけないでしょうか?どうぞよろしくお願いいたします

if(c!=null){
Log.d("cはnullではなかった","このLogは出力された");
while(c.moveToNext()){
Log.d("whileには、はいれなかった","このLogはしゅつりょくされなかった");
   }
}
public class LocationActivity extends FragmentActivity implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener {


    private TextView textView;
    private String textLog = "start \n";

    // LocationClient の代わりにGoogleApiClientを使います
    private GoogleApiClient mGoogleApiClient;
    private boolean mResolvingError = false;

    private FusedLocationProviderApi fusedLocationProviderApi;

    private LocationRequest locationRequest;
    private Location location;
    private long lastLocationTime = 0;

    ///////////////////取得したlongitudeとlatitude
    double latitude;
    double longitude;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d("LocationActivity", "onCreate");
        textView = (TextView) findViewById(R.id.text_view);

        /////////////////////////locationRequest
        // LocationRequest を生成して精度、インターバルを設定
        locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(1000);
        locationRequest.setFastestInterval(16);

        fusedLocationProviderApi = LocationServices.FusedLocationApi;
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        Log.d("LocationActivity", "mGoogleApiClient");

        textLog += "onCreate() \n";
        textView.setText(textLog);


        Button buttonTransmission = (Button) findViewById(R.id.buttonTransmission);
        buttonTransmission.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                MyOpenHelper helper = new MyOpenHelper(LocationActivity.this);
                SQLiteDatabase db = helper.getWritableDatabase();

                EditText editText = (EditText) findViewById(R.id.Transmission);
                String comment = editText.getText().toString();

                textLog += "start  insert : " + comment + "\n";
                textView.setText(textLog);

                //calendarの取得
                Calendar calendar = Calendar.getInstance();
                int month = calendar.get(Calendar.MONTH) + 1;
                int day = calendar.get(Calendar.DATE);
                int hour = calendar.get(Calendar.HOUR);
                int minute = calendar.get(Calendar.MINUTE);
                int second = calendar.get(Calendar.SECOND);
                String data = month + "/ " + day + " " + hour + ":" + minute + ": " + second;

                String username = "ta";

                String sql = "insert into neardb(data,username,comment,latitude,longitude)" +
                        " values ('" + data + "','" + username + "','" + comment + "'," + latitude + "," + longitude + ");";

                Log.v("-----insertのsql-----", sql);

                TextView textView;
                String textLog = "insertします\n";
                textView = (TextView) findViewById(R.id.text_view);


                Cursor c = db.rawQuery(sql, null);
                textLog += "insertしました : " + sql + "\n";
                textView.setText(textLog);

                c.close();
                db.close();

                Log.d("--FusedLocationよぶ--", "insert終了");

                startFusedLocation();
            }
        });
    }


    private void startFusedLocation() {
        Log.d("fusedLocation", "よばれた");


        // Connect the client.
        if (!mResolvingError) {
            // Connect the client.

            Log.d("---googleconectよぶ---", "mGoogleconnect");

            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();

            mGoogleApiClient.connect();

            textLog += "onStart(), connect() \n";
            textView.setText(textLog);
        } else {
            textLog += "onStart(), mResolvingError \n";
            textView.setText(textLog);
        }

    }

    //このConnectedで、データを取得してるからこれを5分おきに行うようにしたいから
    //これを呼び出してるところをtimerして、

    @Override
    public void onConnected(Bundle bundle) {
        Log.d("LocationActivity", "onConnected");

        Log.d("---googleconectよばれた---", "onConnected到着");


        textLog += "onConnected()\n";
        textView.setText(textLog);

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) !=
                PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) !=
                PackageManager.PERMISSION_GRANTED) {
            return;
        }

        Location currentLocation = fusedLocationProviderApi.getLastLocation(mGoogleApiClient);

        if (currentLocation != null && currentLocation.getTime() > 20000) {
            location = currentLocation;

            Log.d("---googlecon順調-----", "次はselectする");

            textLog += "----onConnectedした--- \n";
            textLog += "取得:Latitude=" + String.valueOf(location.getLatitude()) + "\n";
            textLog += "取得:Longitude=" + String.valueOf(location.getLongitude()) + "\n";
            textView.setText(textLog);


            latitude = location.getLatitude();
            longitude = location.getLongitude();


            MyOpenHelper helper = new MyOpenHelper(this);
            SQLiteDatabase db = helper.getReadableDatabase();

            //このメソッドは
            double clearlatitude = 0.00002694944;
            double clearlongitude = 0.00032899147;

            String z = BigDecimal.valueOf(clearlatitude).toPlainString();
            String zz = BigDecimal.valueOf(clearlongitude).toPlainString();

//自分の値からこの人の値を引いてこのすうじいかならok
            String sql = "select * from neardb ;";

            Log.v("-----selectする文-----", sql);


            /**
             String sql= "select data,username,comment from neardb " +
             "where latitude - "+latitude+" <= "+z+" and "
             +latitude+" - latitude <= "+z+
             " and longitude - "+longitude+" <= "+zz+" and "
             +longitude+" - longitude <= "+zz+";";
             **/

            Cursor c = db.rawQuery(sql, null);
            Log.d("---sql実行した----", "実行完了");


            textView.setText(textLog);
            Log.d("movefirstの前 Positi1/", "" + c.getPosition());

            c.moveToFirst();

            Log.d("movefirstの後 Positi2/", "" + c.getPosition());


            if (c != null) {
                Log.d("---c!=null あとはfor()--", "nullじゃない確定");
                Log.d("今の Positi3/", "" + c.getPosition());


                for (int i = 1; i <= c.getCount(); i++) {
                    //SQL文の結果から、必要な値を取り出す

                    Log.d(" forにはいった Positi4/", "" + c.getPosition());

                    Log.d("いえーーーーい", "次は取得");


                    TextView textView = (TextView) findViewById(R.id.text_view);
                    textView.setText(String.format("%s    %s : %s", c.getString(0), c.getString(1), c.getString(2)));

                    String d = c.getString(0);
                    String e = c.getString(1);
                    String f = c.getString(2);

                    textLog += "データベースの c から取得: " + d + ":" + e + ":" + f + "\n";
                    textView.setText(textLog);


                  c.moveToNext();

          }
                c.close();
                db.close();

                Log.d("まずイエーイがこないってことはwhile","はじかれた,次はとくにない?");
            }

            Log.d("if(c=null)", "だった場合とくにない");
}


// 測位開始
Button buttonStart = (Button) findViewById(R.id.button_start);
// 測位終了
Button buttonStop = (Button) findViewById(R.id.button_stop);
private void stopFusedLocation() {
protected void onStart() {
protected void onStop() {
@Override
public void onLocationChanged(Location location) {
if (c != null) { の
} else {
は字数の関係上書いてありません。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

Androidアプリのデータ保存方法の一つ「SQLite」の使い方 レコード検索編 | mucchinのAndroid戦記リンク内容

次は、後判定のループ処理となってますね。
Cursor.moveToNext()は、カーソルを次のレコードへ移動させる、という意味合いです。
このmoveToNext()の戻り値は、次のレコードがあればカーソルを移動させてtrueを戻します。
次のレコードが無ければfalseを返します。
ちなみに、後判定としているのは、一番最初のレコードの処理を行う為です。

追記
ほんとだ。まだ直ってなかったのか。

ちなみに、rawQuery()はselect文専用です。
insert、update、delete等は、execSQL()メソッドを使います。
詳しくは下記をご覧下さい。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/29 17:49

    rawQuery()をinsertに使っていたことが全ての原因でした。
    これ以前に作っていたアプリでもCursorがからとなっており、それも、rawQueryを使っているからでした。ありがとうございます。
    解決しました。

    キャンセル

0

cは、nullではないということから、selectは、できていると考えるのですが、whileでは、falseが返されます。なぜでしょうか? 

何度も言いますがselectの結果が空だからです。なぜ伝わらないのでしょうか。
Cursor#getCountして確認してください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/29 17:47

    ありがとうございます。
    insertしないとnullでなく、""(から文字)になるのですね。
    insertできていないとのことですね。ありがとうございます。

    キャンセル

  • 2017/04/29 17:49

    なにを理解したのわかりませんが、違います。

    キャンセル

  • 2017/04/29 19:21

    rawQuery()をexecSQL()と、変更したところ、
    Cursorは、からでなくwhileでtrueが返されました。

    キャンセル

0

Cursorがnull≠Cursorが空 です。
Cursorがnullであれば、moveToNext()した時点でNullPointerExceptionが発生します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/29 17:46

    から文字("")でチェックをしていませんでした。
    moveToNext()した時にNullPointerExceptionが発生するということも知らなかったです。
    つまり、insertできていないないと言うことですね。ありがとうございます。

    キャンセル

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

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる