Java 我创建了一个空数据库,里面没有任何表和数据

Java 我创建了一个空数据库,里面没有任何表和数据,java,android,database,sqlite,Java,Android,Database,Sqlite,我的数据库有问题。没有任何表和数据,只有空数据库。我应该在代码中更改什么?我想创建一个带有硬编码值的数据库,因为我想稍后在spinner中使用它们 Database class public class Database extends SQLiteOpenHelper { private static final String DATABASE_NAME = "CurrencyExchange.db"; private static final String CUR

我的数据库有问题。没有任何表和数据,只有空数据库。我应该在代码中更改什么?我想创建一个带有硬编码值的数据库,因为我想稍后在spinner中使用它们

Database class

    public class Database extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "CurrencyExchange.db";
    private static final String CURRENCY_TABLE = "currency_table";



    public Database(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE "+CURRENCY_TABLE+ " ( ID INTEGER PRIMARY KEY AUTOINCREMENT, BGN TEXT, NZD TEXT, ILS TEXT, RUB TEXT, CAD TEXT, USD TEXT, PHP TEXT, CHF TEXT, ZAR TEXT, AUD TEXT, JPY TEXT, TRY TEXT, HKD TEXT, MYR TEXT, THB TEXT, HRK TEXT, NOK TEXT, IDR TEXT, DKK TEXT, CZK TEXT, HUF TEXT, GBP TEXT, MXN TEXT, KRW TEXT, ISK TEXT, SGD TEXT, BRL TEXT, PLN TEXT, INR TEXT, RON TEXT, CNY TEXT, SEK TEXT)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS "+CURRENCY_TABLE);
    onCreate(db);
}

public boolean insertData(){
    SQLiteDatabase database = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();

    final String insert_data = "INSERT INTO "+CURRENCY_TABLE+ " VALUES (0,'BGN','NZD','ILS','RUB','CAD','USD','PHP','CHF','ZAR','AUD','JPY','TRY','HKD','MYR','THB','HRK','NOK','IDR','DKK','CZK','HUF','GBP','MXN','KRW','ISK','SGD','BRL','PLN','INR','RON','CNY','SEK')";
    contentValues.put(CURRENCY_TABLE, insert_data);
    return database.insert(CURRENCY_TABLE, null, contentValues) != -1;
}
主要活动

    public class MainActivity extends AppCompatActivity {

Database database;

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

    database = new Database(this);
    database.insertData();
这不是您使用ContentValues的方式

使用您创建的insert_数据变量,可以再次使用db.execSQL

如果要使用ContentValues和database.insert,则必须这样使用它:

ContentValues values= new ContentValues();
values.put(COLUMN1_NAME, value1);
values.put(COLUMN2_NAME, value2);
values.put(COLUMN3_NAME, value3);
//for each column of your table

return database.insert(CURRENCY_TABLE, null, values) != -1;
您想要做的是将insertData方法更改为:-

public boolean insertData( String bgn, String nzd, String ils, String run, String cad,
                           String usd, String php, String chf, String zar, String aud, String jpy,
                           String TRY, String hkd, String myr, String thb, String hrk, String nok,
                           String idr, String dkk, String czk, String huf, String gbp, String mxn,
                           String krw, String isk, String sgd, String brl, String pln, String inr,
                           String ron, String cny, String sek){

    SQLiteDatabase database = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("BGN",bgn);
    contentValues.put("NZD",nzd);
    contentValues.put("ILS",ils);
    contentValues.put("RUB",run);
    contentValues.put("CAD",cad);
    contentValues.put("USD",usd);
    contentValues.put("PHP",php);
    contentValues.put("CHF",chf);
    contentValues.put("ZAR",zar);
    contentValues.put("AUD",aud);
    contentValues.put("JPY",jpy);
    contentValues.put("TRY",TRY);
    contentValues.put("HKD",hkd);
    contentValues.put("MYR",myr);
    contentValues.put("BGN",bgn);
    contentValues.put("THB",thb);
    contentValues.put("HRK",hrk);
    contentValues.put("NOK",nok);
    contentValues.put("IDR",idr);
    contentValues.put("DKK",dkk);
    contentValues.put("CZK",czk);
    contentValues.put("HUF",huf);
    contentValues.put("GBP",gbp);
    contentValues.put("MXN",mxn);
    contentValues.put("KRW",krw);
    contentValues.put("ISK",isk);
    contentValues.put("SGD",sgd);
    contentValues.put("BRL",brl);
    contentValues.put("PLN",pln);
    contentValues.put("INR",inr);
    contentValues.put("RON",ron);
    contentValues.put("CNY",cny);
    contentValues.put("SEK",sek);
    return database.insert(CURRENCY_TABLE, null, contentValues) != -1;
}
当然,这假定您希望使用括号内没有逗号分隔的列列表的值为每列插入一个值来指定所有列 注意:没有为第一列ID提供值,这将自动生成,这是ID列的典型用法。 添加此方法

public Cursor getAllRowsFromCurrencyTable() {
    SQLiteDatabase db = this.getWritableDatabase();
    return db.query(CURRENCY_TABLE,null,null,null,null,null,null);
}
以及在活动中使用以下内容并运行一次:-

public class MainActivity extends AppCompatActivity {

    Database database;

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

        database = new Database(this);
        // Add a row for tesing
        database.insertData("A","B","C","D",
                "E","F","G","H","I",
                "J","K","L","M","N",
                "O","P","Q","R","S",
                "T","U","V","W","X",
                "Y","Z","AA","AB","AC",
                "AD","AE","AF"
        );
        // Get all the rows (1) and dump the resultant Cursor
        Cursor csr = database.getAllRowsFromCurrencyTable();
        DatabaseUtils.dumpCursor(csr);
        csr.close(); // Should always close a Cursor when done with it.

    }
}
结果:-

2019-05-13 19:37:28.974 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@76cd9ae
2019-05-13 19:37:28.974 I/System.out: 0 {
2019-05-13 19:37:28.975 I/System.out:    ID=1
2019-05-13 19:37:28.975 I/System.out:    BGN=A
2019-05-13 19:37:28.975 I/System.out:    NZD=B
2019-05-13 19:37:28.975 I/System.out:    ILS=C
2019-05-13 19:37:28.975 I/System.out:    RUB=D
2019-05-13 19:37:28.975 I/System.out:    CAD=E
2019-05-13 19:37:28.975 I/System.out:    USD=F
2019-05-13 19:37:28.975 I/System.out:    PHP=G
2019-05-13 19:37:28.975 I/System.out:    CHF=H
2019-05-13 19:37:28.975 I/System.out:    ZAR=I
2019-05-13 19:37:28.975 I/System.out:    AUD=J
2019-05-13 19:37:28.975 I/System.out:    JPY=K
2019-05-13 19:37:28.976 I/System.out:    TRY=L
2019-05-13 19:37:28.976 I/System.out:    HKD=M
2019-05-13 19:37:28.976 I/System.out:    MYR=N
2019-05-13 19:37:28.976 I/System.out:    THB=O
2019-05-13 19:37:28.976 I/System.out:    HRK=P
2019-05-13 19:37:28.976 I/System.out:    NOK=Q
2019-05-13 19:37:28.976 I/System.out:    IDR=R
2019-05-13 19:37:28.976 I/System.out:    DKK=S
2019-05-13 19:37:28.976 I/System.out:    CZK=T
2019-05-13 19:37:28.976 I/System.out:    HUF=U
2019-05-13 19:37:28.976 I/System.out:    GBP=V
2019-05-13 19:37:28.977 I/System.out:    MXN=W
2019-05-13 19:37:28.977 I/System.out:    KRW=X
2019-05-13 19:37:28.977 I/System.out:    ISK=Y
2019-05-13 19:37:28.977 I/System.out:    SGD=Z
2019-05-13 19:37:28.977 I/System.out:    BRL=AA
2019-05-13 19:37:28.977 I/System.out:    PLN=AB
2019-05-13 19:37:28.977 I/System.out:    INR=AC
2019-05-13 19:37:28.977 I/System.out:    RON=AD
2019-05-13 19:37:28.977 I/System.out:    CNY=AE
2019-05-13 19:37:28.977 I/System.out:    SEK=AF
2019-05-13 19:37:28.977 I/System.out: }
2019-05-13 19:37:28.977 I/System.out: <<<<<
活动的布局,即微调器添加的活动\u main.xml:-

最后是更改后的活动MainActivity.java

结果是:-

显然你会增强外观,这只是一个演示 你只要相信我的话,烤面包片就能抓住它

注意:要部署此更改,应执行以下操作之一:-

卸载应用程序 删除应用程序的数据 增加版本号,即更改超级上下文、数据库名称、null、1;到超级上下文,数据库名称,null,2;
我真的很惊讶,我想非常感谢你。但是,如果我的代码第一次运行,那将很无聊…:我有一个问题,关于spinner,它没有显示任何内容。我将用更新的内容编辑我的问题code@Szal21,如果你把它作为另一个问题问会更好。一个建议是,创建另一个项目并按原样复制代码。如果这项工作应该做,除非我犯了一个错误,然后慢慢改变原来的相应。“微调器”方面与最初的问题相比已经有些过时了,可能会让其他人感到困惑。好吧,那么,我将尝试自己解决它。@Szal21您确实按照最后的说明执行了三个选项之一卸载应用程序、删除应用程序的数据或增加版本号。它现在正在工作,但我面临另一个问题。今天我没心思:
2019-05-13 19:37:28.974 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@76cd9ae
2019-05-13 19:37:28.974 I/System.out: 0 {
2019-05-13 19:37:28.975 I/System.out:    ID=1
2019-05-13 19:37:28.975 I/System.out:    BGN=A
2019-05-13 19:37:28.975 I/System.out:    NZD=B
2019-05-13 19:37:28.975 I/System.out:    ILS=C
2019-05-13 19:37:28.975 I/System.out:    RUB=D
2019-05-13 19:37:28.975 I/System.out:    CAD=E
2019-05-13 19:37:28.975 I/System.out:    USD=F
2019-05-13 19:37:28.975 I/System.out:    PHP=G
2019-05-13 19:37:28.975 I/System.out:    CHF=H
2019-05-13 19:37:28.975 I/System.out:    ZAR=I
2019-05-13 19:37:28.975 I/System.out:    AUD=J
2019-05-13 19:37:28.975 I/System.out:    JPY=K
2019-05-13 19:37:28.976 I/System.out:    TRY=L
2019-05-13 19:37:28.976 I/System.out:    HKD=M
2019-05-13 19:37:28.976 I/System.out:    MYR=N
2019-05-13 19:37:28.976 I/System.out:    THB=O
2019-05-13 19:37:28.976 I/System.out:    HRK=P
2019-05-13 19:37:28.976 I/System.out:    NOK=Q
2019-05-13 19:37:28.976 I/System.out:    IDR=R
2019-05-13 19:37:28.976 I/System.out:    DKK=S
2019-05-13 19:37:28.976 I/System.out:    CZK=T
2019-05-13 19:37:28.976 I/System.out:    HUF=U
2019-05-13 19:37:28.976 I/System.out:    GBP=V
2019-05-13 19:37:28.977 I/System.out:    MXN=W
2019-05-13 19:37:28.977 I/System.out:    KRW=X
2019-05-13 19:37:28.977 I/System.out:    ISK=Y
2019-05-13 19:37:28.977 I/System.out:    SGD=Z
2019-05-13 19:37:28.977 I/System.out:    BRL=AA
2019-05-13 19:37:28.977 I/System.out:    PLN=AB
2019-05-13 19:37:28.977 I/System.out:    INR=AC
2019-05-13 19:37:28.977 I/System.out:    RON=AD
2019-05-13 19:37:28.977 I/System.out:    CNY=AE
2019-05-13 19:37:28.977 I/System.out:    SEK=AF
2019-05-13 19:37:28.977 I/System.out: }
2019-05-13 19:37:28.977 I/System.out: <<<<<
public class Database extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "CurrencyExchange.db";
    public static final String CURRENCY_TABLE = "currency_table";
    public static final String CURRENCY_ID_COLUMN = BaseColumns._ID; // Allows Spinner/ListView with Cursor Adapter
    public static final String CURRENCY_CODE_COLUMN = "currency_code";

    // The Currency Codes
    public static final String[] currency_codes = new String[]{
            "BGN", "NZD", "ILS", "RUB", "CAD", "USD", "PHP", "CHF",
            "ZAR", "AUD", "JPY", "TRY", "HKD", "MYR", "THB", "HRK",
            "NOK", "IDR", "DKK", "CZK", "HUF", "GBP", "MXN", "KRW",
            "ISK ", "SGD", "BRL", "PLN", "INR", "RON", "CNY", "SEK"
    };

    public Database(Context context) {
        super(context, DATABASE_NAME, null, 2); // Version changed so will drop old table and recreate new
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        /* OLD
        db.execSQL("CREATE TABLE " + CURRENCY_TABLE + " ( ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "BGN TEXT, NZD TEXT, ILS TEXT, RUB TEXT, CAD TEXT, USD TEXT, PHP TEXT, CHF TEXT, " +
                "ZAR TEXT, AUD TEXT, JPY TEXT, TRY TEXT, HKD TEXT, MYR TEXT, THB TEXT, HRK TEXT, " +
                "NOK TEXT, IDR TEXT, DKK TEXT, CZK TEXT, HUF TEXT, GBP TEXT, MXN TEXT, KRW TEXT, " +
                "ISK TEXT, SGD TEXT, BRL TEXT, PLN TEXT, INR TEXT, RON TEXT, CNY TEXT, SEK TEXT)");
        */
        db.execSQL("CREATE TABLE " + CURRENCY_TABLE + "(" +
                CURRENCY_ID_COLUMN + " INTEGER PRIMARY KEY, " + // NO NEED FOR AUTOINCREMENT (it's inefficient)
                CURRENCY_CODE_COLUMN + " TEXT UNIQUE " + // UNIQUE means will not add duplicates
                ")");
        addAllCurrencyCodes(db);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + CURRENCY_TABLE);
        onCreate(db);
    }

    private void addAllCurrencyCodes(SQLiteDatabase database) {
        if (database == null) {
            database = this.getWritableDatabase();
        }
        database.beginTransaction();
        for (String currency_code: currency_codes) {
            addCurrencyCode(currency_code,database);
        }
        database.setTransactionSuccessful();
        database.endTransaction();
    }

    public void addCurrencyCode(String code, SQLiteDatabase database) {

        if (database == null) {
            database = this.getWritableDatabase();
        }
        ContentValues contentValues = new ContentValues();
        contentValues.put(CURRENCY_CODE_COLUMN,code);
        database.insert(CURRENCY_TABLE,null,contentValues);
    }

    public Cursor getAllRowsFromCurrencyTable() {
        SQLiteDatabase db = this.getWritableDatabase();
        return db.query(CURRENCY_TABLE,null,null,null,null,null,null);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

    <Spinner
        android:id="@+id/currrency_code_selector"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </Spinner>

</LinearLayout>
public class MainActivity extends AppCompatActivity {

    Database database;
    Spinner currency_code_selector;
    SimpleCursorAdapter mSCA;
    Cursor csr;
    Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        currency_code_selector = this.findViewById(R.id.currrency_code_selector);

        database = new Database(this);
        // For testing only
        csr = database.getAllRowsFromCurrencyTable();
        DatabaseUtils.dumpCursor(csr);
        manageCurrencyCodeSpinner();
    }

    private void manageCurrencyCodeSpinner() {
        csr = database.getAllRowsFromCurrencyTable();
        if (mSCA == null) {
            mSCA = new SimpleCursorAdapter(
                    this, // The context
                    android.R.layout.simple_dropdown_item_1line, // The layout (stock layout used)
                    csr, // The Cursor for the Spinner
                    new String[]{Database.CURRENCY_CODE_COLUMN}, // The columns holding the data
                    new int[]{android.R.id.text1}, // The View into which the data is placed
                    0 // 0 is fine
            );
            currency_code_selector.setAdapter(mSCA); // Tie the adapter to the Spinner
            // Setup selection handling
            currency_code_selector.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    if (view == null) return;
                    Toast.makeText(view.getContext(),
                            "You have just selected the currency code " +
                                    csr.getString(csr.getColumnIndex(Database.CURRENCY_CODE_COLUMN)) +
                                    ". The ID is " + String.valueOf(id),
                            Toast.LENGTH_SHORT ).show();
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {

                }
            });
        } else {
            mSCA.swapCursor(csr); // if spinner already setup refresh the contents
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        csr.close(); //<<<<<<<<<< close the cursor when done with it
    }

    @Override
    protected void onResume() {
        super.onResume();
        manageCurrencyCodeSpinner(); // refresh the Spinner as data may have changed
    }
}