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

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

ただいまの
回答率

88.92%

if(ca.moveToFirst){ でfalseが返されます。アドバイスをいただけないでしょうか?

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,277

edoooooo

score 162

boolean isEof = ca.moveToFirst();
while(isEof) {
doge =  ca.getString(ca.getColumnIndex(Usersdata.Users.DOGE));
Log.v("whileでfalseが返されます。"doge);
}
なぜだかわかりません。アドバイスをいただけないでしょうか?

MainActivityで、if文でデータベースから取得した値がtrueであれば、今日の残りHPを100とリセットし、データベースのtrueをfalseにupdateし、24時になると、AlarmManagerの起動によって移動先のServiceで、trueにアップデートする。
そうすることで、onStart()のなかでありながら、24時になった時の、AlarmManagerによって、Serviceと行き来する時だけ、MainActivityのbuttonのonClickListenerの中の100-(i++)によって小さくなった残り体力:iを100に初期化するということを実現したいです。

//MainActivity

/**
se=select 、up=update 、in=insert、bd=body(体力)、cobo=countbody 、stcobo=string count body、hp=100-body 、stringbody=string.valueOf(hp)
**/

import static com.example.android.sample.physicalstrength.Databaseset.CREATE_TABLE;

import static com.example.android.sample.physicalstrength.Databaseset.CREATE_TABLE1;


public class MainActivity extends AppCompatActivity {

    int body = 2;
    int cobo=0;
    boolean zzz=false;

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


        TextView textView = (TextView) findViewById(R.id.body);
        String nokko="残りは100です。";
        textView.setText(noko);

        SQLiteDatabase db = null;
        Databaseset databaseset = new Databaseset(MainActivity.this);
        db = databaseset.getWritableDatabase();


        //コメントアウトしてる
       // db.execSQL(CREATE_TABLE);
       // db.execSQL(CREATE_TABLE1);

        findViewById(R.id.hp).setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View v) {

                SQLiteDatabase db = null;
                Databaseset databaseset = new Databaseset(MainActivity.this);
                db = databaseset.getWritableDatabase();

                String table = Usersdata.Users.TABLE_NAME;

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


                cobo =body++;
                String stcobo = String.valueOf(cobo);

                String sql = "INSERT INTO " + table + "(hp,data) " + "VALUES('" + stcobo + "','" + data + "')";


                ///Serviceで、update文で、id 1の、データのdataをStringがたのoldにして、
                //Activityで、データベースから取得した値がnew ならばoldにする、そして、データベースに集計を入れる。
                String stringhp=null;
                Log.v("insertしてるやつ",stcobo+"  : "+data);
                int hp = 100 - cobo;

                if(hp > 0) {
                    stringhp = "残りは" + hp + "です。";
                }else if(hp==0){
                    stringhp = "もう" + hp + "です。";
                }else {
                    stringhp =  hp + "になっています。";
                }

                TextView textView = (TextView) findViewById(R.id.body);
                textView.setText(stringhp);

                Cursor c = db.rawQuery(sql, null);
                c.close();
            }
        });


    }


    @Override
    public void  onStart(){
        super.onStart();

        String x="まじで";Log.v("ここに一点の?",x);

        SQLiteDatabase db = null;
        Databaseset databaseset = new Databaseset(MainActivity.this);
        db = databaseset.getWritableDatabase();

        String table1 = Usersdata.Users.TABLE_NAME1;

        ////////
       // String insert="insert into "+table1+" (doge) values('true')";
      //  Log.v("insert////",insert);


        String select = "select * from "+table1;
        Log.v("select////",select);

        //////////
     //   Cursor in=db.rawQuery(insert,null);
        //このinを何かに使わなきゃいけないんじゃなかったっけ?


        Cursor se = db.rawQuery(select, null);


        String doge="false";


        //ここではいれてない
        boolean isEof = se.moveToFirst();
        Log.d("Before Cursor Position/","" + se.getPosition());
        se.moveToNext();
        Log.d("Before Cursor Position/","" + se.getPosition());
        // / データを取得していく
        while(isEof) {
            doge =  se.getString(se.getColumnIndex(Usersdata.Users.DOGE));
            Log.v("if入る前Acti:",doge);
        }

        if(doge=="true"){
            //trueになってたら、Serviceでtrueにしたってこと

            body=0;
            Log.v("Maでtrueだったため、if文に入る :",doge);
            String update="update "+table1+" set doge='false'";
            Cursor up=db.rawQuery(update,null);

            //trueってことは、24時間たったってことだからbzを0にして体力回復させる
            body=0;

            String bd=String.valueOf(body);
            Log.v("bodyは0になるはずなのに",bd);

        }
            se.close();
            db.close();


        //
        int aaa=10;
        int bbb=39;
        addReset(aaa,bbb);
        getPendingIntent();

    }




    private static final String TAG = MainActivity.class.getSimpleName();

    //Resetのコード
    public void addReset(int resetHour, int resetMinute) {

        // Reset(リセット)を設定する
        PendingIntent mResetSender = this.getPendingIntent();

        // リセットするメソッドを呼ぶ時間の設定
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.setTimeInMillis(System.currentTimeMillis());
        // 設定した時刻をカレンダーに設定
        cal.set(cal.HOUR_OF_DAY, resetHour);
        cal.set(cal.MINUTE, resetMinute);
        cal.set(cal.SECOND, 0);
        cal.set(cal.MILLISECOND, 0);

        Toast.makeText(this, String.format("%d時%d分にtoast表示のメソッドを呼びます", resetHour, resetMinute), Toast.LENGTH_LONG).show();

        // AlramManager取得
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        // AlarmManagerにPendingIntentを登録
        am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), mResetSender);


        Log.v(TAG, cal.getTimeInMillis() + "ms");
        Log.v(TAG, "2:30に表示するメソッドを呼ぶ、セット完了");
    }
    private PendingIntent getPendingIntent() {
        Intent intent = new Intent(this, MyResetService.class);

        //このintentにクラス変数の値をsetし、Serviceでデータベースにセットする。

        String stcobo=String.valueOf(cobo);

        Log.v("xxxxxxxxxx",stcobo);

        PendingIntent pendingIntent = PendingIntent.getService(this, PendingIntent.FLAG_ONE_SHOT, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        return pendingIntent;

    }

}

//Usersdata

package com.example.android.sample.physicalstrength;



        import android.provider.BaseColumns;

/**
 * Created by endoutaichi on 2017/04/22.
 */

public class Usersdata {

    public Usersdata(){}

    public static abstract class Users implements BaseColumns {



        public static final String _ID="id";
        public static final String TABLE_NAME="body";
        public static final String TABLE_NAME1="doge";
        public static final String COL_HP="hp";
        public static final String COL_DATA="data";

        public static final String DOGE="doge";


    }
}


//Databaseset

public class Databaseset extends SQLiteOpenHelper {


    public static final String DB_NAME="bodyhp.db";
    public static final int DB_VERSION=2;

    public static final String CREATE_TABLE=
            "create table "  + Usersdata.Users.TABLE_NAME + "(" +
                    Usersdata.Users._ID + " integer primary key autoincrement, " +
                    Usersdata.Users.COL_HP + " text, " +
                    Usersdata.Users.COL_DATA + " text)";

    public static final String CREATE_TABLE1=
            "create table "+Usersdata.Users.TABLE_NAME1+"("+
                    Usersdata.Users.DOGE+" text )";




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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+3

たとえば

//適当です。
a=kan1(ii);
b=kan2(a,"aa");
if(c.kan3){
}


これのifが通らないとしましょう。
まず、c.kan3がどのような返り値を返してるか調べます。
これがtrueでなければ通らないわけですから。
この関数が何を返すかは、Logを確認するのとリファレンスを見ます。
ここでfalseを返してるなら使い方を間違ってるか、その前の部分がおかしいです。
ここでいったんあきらめてb=kan2(a,"aa")を見ます。
ここもkan2がどんな関数でどんな値を返してるか、使い方に間違いはないか見ます。
確認方法は先ほどと一緒です。
ここでも想定してない値が出たのならば、さらに戻ります。
kan1(ii)の中身を調べます。
やることは変わらないです。
ここでもだめなのであればiiの中身がどうなってるか見ます。
このiiの部分がデータベースになってるパターンもあるでしょう。
そうしますと第三者から見ると、iiの元となっているデータをすべて見せてくれとしかいえないです。
そして、サンプルでもない限りそれは見せれないでしょう。
なので想像で補うのですが、それも確かではありません。
つまりこれを作った本人しかどうしようもないのです。
解答としては、
関数の使い方間違ってませんか?ちゃんと意図した数値を返してますか?リファレンス読んであってますか?
などとしかいえなくなります。
きちんと関数は整備されてるので、きちんと使えばきちんといい値を返してくれます。
想定しなかった場合の値は、ほぼ使い方が間違ってるといっていいでしょう。
こういうのを自分で確かめるのがデバックといいます。
自分で確かめて修正するまでが、デバックです。

第三者にこんなの返ってきたけどというのはデバックではありません。ただの報告です。

また、毎回こういうやり取りをしてますが、それだと開発は無理です。
100%質問に答えてくれるわけでもないし、たしょうなりとも自分で出来るようにならないと
今後答えが帰ってこなかった場合そこで開発は中止になります。
一生完成しません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/04/24 17:43

    どう答えればいいのかがわからないです。すみません
    shell@android:/data/data/com.example.android.sample.mydbapp/databases $ ls
    myapp.db
    myapp.db-journal
    myappp.db
    myappp.db-journal
    ite3 myapp.db
    このような状況で、本来は、sqlite3 myapp.db として、
    その後は、select* from user;ができるバズだったのですが、
    sh:sqlite3:not fount というエラーを調べたら
    sqlite3は全ての端末に入っていないらしくて、sqlite3を入れるために、Android向けのsqlite3をまず入手する必要があるとのことでした。

    キャンセル

  • 2017/04/24 17:53

    結論から言うとそちらの準備不足が原因っぽいのでこの質問は解決できません。この質問はクローズして準備期間を設けて質問したほうがいいと思います。自分でやれるべきことをすべてやってから質問はしてください。

    キャンセル

  • 2017/04/24 17:56

    わかりました。ありがとうございました。

    キャンセル

checkベストアンサー

+1

検索結果が空だからです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/04/24 11:08

    se=select 、up=update 、in=insert、bd=body(体力)、cobo=countbody 、stcobo=string count body、hp=100-body 、stringbody=string.valueOf(hp)

    全ての変数に一通り意味のある名前をつけました。

    キャンセル

  • 2017/04/24 11:35

    まだcccとかあるじゃ無いですか。

    アドバイスはデータの挿入部分をデバッグしてください。デバッグとはコードを読むことではありません。
    これ以上この質問にはコメントはしません。

    キャンセル

  • 2017/04/24 11:45

    ありがとうございました。

    キャンセル

0

データベースの内容そのものを確認せよと以前に回答しましたよね?
「結果が空」なら、このチェックは絶対必要ですし、むしろ必要と感じないのがおかしい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/04/24 14:09

    データベースの中身を出力しないとでバックができないということですよね?
    以前eclipseでjavaでwebアプリを作っていた時には、h2dabaseというものでターミナルから操作していたので、AndroidStudioでターミナルを使えないのは、大変でした。

    キャンセル

  • 2017/04/24 14:13

    出力することそのものが目的ではありません。内容を確認しないと、問題がデータベースにあるのか、SQL文に問題があるのか特定出来ないからです。

    やはり現段階のあなたにこのような開発は無理です。ここでの質問も効率が悪すぎます。今すぐ開発をやめて、JavaやSQLの基礎からの勉強をやり直してください。

    キャンセル

  • 2017/04/24 14:16

    内容を確認しないと、問題がデータベースにあるのか、SQL文に問題があるのか特定出来ないからです。
    全くこの通りと考えていました。

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る