0

はい、これは宿題ですが、十分な注意を払いましたが、行き詰まっています! うまくいけば、誰かが助けてくれるでしょう!

rawQuery に問題があります。何も表示されていません。put()テスト用にいくつかの挿入ステートメントを追加したため(そしてandでも試しましたinsert())、データベースが空ではないことは確かです。それでも、何も表示されませんでした。

問題は、コードを実行するとエラーや例外が発生しないことですが、logDatabase ( while !c.moveToNext) の while ループに入ることはありません。

私はかなりの量の調査を行いましたが、私が見ているすべての本は、このようにするように指示しているようです. おそらく私は明らかな何かを見逃していますが、それが何であるかを一生理解することはできません。ありがとう!

package jschuler.cs211d.hw06b;

    import android.app.Activity;
    import android.os.*;
    import android.widget.*;
    import android.util.Log;
    import android.view.*;
    import java.util.*;
    import java.io.*;
    import android.content.*;
    import android.database.*;
    import android.database.sqlite.SQLiteDatabase;

    public class play extends Activity 
                      implements RadioGroup.OnCheckedChangeListener
    {    
        private static final String DBNAME = "statesDB";
        static final String STATE = "state", CAPITAL = "capital";

    //*****************************onCreate()*****************************
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.play);

            // Check to see if SD card is available. If not, warn the user
            if(!sdCardAvailable())
            {
                Toast t = Toast.makeText(getApplicationContext(), 
                    "No SD card available.", 
                    Toast.LENGTH_SHORT);
                t.show();
            }
            else
            {
                Toast t = Toast.makeText(getApplicationContext(), 
                    "SD card is available.", 
                    Toast.LENGTH_SHORT);
                t.show();
            }

            loadDB();
        }
    //**************************onCheckChanged()**************************
    //  Set the variable that represents the type, depending on 
    //  what the user has selected in the radio group.    
        public void onCheckedChanged(RadioGroup g, int CheckedId)
        {

        }
    //******************************loadDB()******************************
    //  Create the data structures to hold the data
        public void loadDB()
        {
            SQLiteDatabase db;
            db = openOrCreateDatabase("statesDB", 
                SQLiteDatabase.CREATE_IF_NECESSARY, null);

            db.setVersion(1);
            db.setLockingEnabled(true);

            db.execSQL("CREATE TABLE if not exists states(_id integer primary key autoincrement, STATE text, CAPITAL text);");

            Scanner sc;

            try
            {
                File sdCard = Environment.getExternalStorageDirectory();
                File dir = new File(sdCard.getAbsolutePath());
                File f = new File(dir, "US_states");
                sc = new Scanner(f);

                // Skip the first line
                sc.nextLine();
                sc.nextLine();

                // Read in the names of the states and capitals. 
                while(sc.hasNextLine())
                {
                    String[] nextItem = sc.nextLine().split("\\s{2,}");
                    ContentValues cv = new ContentValues();
                    cv.put(STATE, nextItem[0]);
                    db.insert("states", STATE, cv);
                    cv.put(CAPITAL, nextItem[1]);
                    db.insert("states", CAPITAL, cv);
                }
            }
            catch (FileNotFoundException e)
            {
                Toast t = Toast.makeText(getApplicationContext(), 
                    "Error loading data.", 
                    Toast.LENGTH_SHORT);
                t.show();
            }

            db.close();

            logDatabase();
        }
    //***************************logDatabase()****************************
        public void logDatabase()
        {
            SQLiteDatabase db;
            db = openOrCreateDatabase("statesDB", 
                SQLiteDatabase.CREATE_IF_NECESSARY, null);

            db.execSQL("INSERT INTO states (STATE) values ('AB');");
            db.execSQL("INSERT INTO states (STATE) values ('CD');");
            db.execSQL("INSERT INTO states (STATE) values ('EF');");

            ContentValues cv = new ContentValues();
            cv.put(STATE, "AB");
            db.insert("states", STATE, cv);

            Cursor c = db.rawQuery("SELECT STATE, CAPITAL FROM states",null);

            while(!c.moveToNext())
            {
                Log.d("mtn","in moveToNext()");
                Log.d("state",c.getString(0));
                Log.d("capital",c.getString(1));
            }

            db.close();
        }
    //*************************sdCardAvailable()**************************
    //  Determine whether there is an SD card available and if it is 
    //  writable.
        public boolean sdCardAvailable()
        {
            boolean storageAvailable = false;
            boolean storageWritable = false;

            String state = Environment.getExternalStorageState();

            if(Environment.MEDIA_MOUNTED.equals(state))
            {
                storageAvailable = storageWritable = true;
            }
            else if(Environment.MEDIA_MOUNTED_READ_ONLY.equals(state))
            {
                storageAvailable = true;
                storageWritable = false;
            }
            else
            {
                storageAvailable = storageWritable = false;
            }

            return (storageWritable && storageAvailable);
        }
    }
4

3 に答える 3

2
while(!c.moveToNext()) 

英語に翻訳されたこの行は、「次の項目に移動できない間、ループに入り、それ以外の場合は終了します」になります。

于 2012-05-17T18:20:12.853 に答える
0

挿入を追加したからといって、それがデータベースに挿入されるわけではありません。ここに参照AndroidInsertステートメントがあります...データベースにデータが入力されていることを確認するには、DDMSを開き、デバイスでエミュレーターを選択していることを確認してから、ファイルエクスプローラー>データ>データ>をクリックしてデータベースをプルしますデータベースマネージャプログラムで開き、selectクエリを実行して、データが含まれていることを確認します。

while(!c.moveToNext())@Alexander Lucasが言ったよう に、「!」を入れているので、コードはループに入らないようにしています。 while(c.moveToNext())

于 2012-05-17T18:27:39.797 に答える
0

このコードを見て、この方法でプログラムを書いてみてください。うまくいくと確信しています....

import android.content.ContentValues;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.database.sqlite.SQLiteOpenHelper;


public class TimeListDatabaseHelper {

    private static final String DATABASE_NAME = "timetracker.db";
    private static final int DATABASE_VERSION = 4;
    private static final String DATABASE_TABLE = "timerecords";


    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_TIME = "note";
    public static final String COLUMN_NOTE = "time";


    private TimeTrackerOpenHelper openHelper;
    private SQLiteDatabase database;


    TimeListDatabaseHelper(Context context) {

        openHelper = new TimeTrackerOpenHelper(context);
        database = openHelper.getWritableDatabase();


    }

    public void saveTimeRecord(String time, String notes) {

        ContentValues contentValue = new ContentValues();

        contentValue.put(COLUMN_TIME, time);
        contentValue.put(COLUMN_NOTE, notes);

        database.insert(DATABASE_TABLE,null, contentValue);




        }



    public Cursor getAllTimeRecords() {
        return database.rawQuery(
        "select * from " + DATABASE_TABLE,
        null
        );
        }


public class TimeTrackerOpenHelper extends SQLiteOpenHelper {

    public TimeTrackerOpenHelper(Context context) {

        super(context,DATABASE_NAME, null , DATABASE_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("CREATE TABLE "+DATABASE_TABLE+"("+COLUMN_ID+" INTEGER PRIMARY KEY AUTOINCREMENT "+","+COLUMN_TIME+" TEXT "+","+COLUMN_NOTE+" NOTE"+")");



    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

                   db.execSQL("DROP TABLE IF EXISTS "+ DATABASE_TABLE);
                   onCreate(db);

    }

}

}

ここで必要なのは、メイン アクティビティでこのクラスのインスタンスを作成し、アクティビティ (つまり「this」) をこのクラス コンストラクターに渡すことです。次に、メイン アクティビティでこのクラスの参照を使用して、このクラスからデータを取得してみます。

例えば:

In main activity class

   TimeListDatabaseHelper db = new TimeListDatabaseHelper(this);
    db.getAllTimeRecords();
于 2012-05-17T18:24:34.400 に答える