首页 > 解决方案 > 我创建了一个没有任何表和数据的空数据库

问题描述

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

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();

标签: javaandroiddatabasesqlite

解决方案


您想要做的(请参阅下文了解为什么这可能不是您想要做的)是将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;
}
  • 当然,这假设您要使用 VALUES 为每一列插入一个值,而括号内没有逗号分隔的列列表指定所有列
  • 请注意,没有为第一列 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: <<<<<
  • 注意 ID= 1 下一个自动生成的 ID 可能是 2,然后是 3 等等(不保证数字会被排序,但很有可能)。

然而

正如你所说

我想创建一个带有硬编码值的数据库,因为我想稍后在微调器中使用它们。

那么您可能不想为货币代码使用列,而是每个货币有 x 行 1。

所以也许考虑这个工作示例,当您选择不同的代码时,使用 Spinner 列出货币代码并发出 Toast :-

修改后的Database.java

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);
    }
}

活动的布局(即添加了微调器)activity_main.xml:-

<?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>

最后是更改的活动MainActivity.java

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
    }
}

结果 :-

在此处输入图像描述

  • 显然你会增强外观,这只是一个演示
  • 你只需要相信我的话,吐司有效(可以捕捉到它)

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

    • 卸载应用程序
    • 删除应用程序的数据
    • 增加版本号即更改super(context, DATABASE_NAME, null, 1);super(context, DATABASE_NAME, null, 2);

推荐阅读