Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何只在数据库中创建一次数据_Android_Sqlite_Spinner - Fatal编程技术网

Android 如何只在数据库中创建一次数据

Android 如何只在数据库中创建一次数据,android,sqlite,spinner,Android,Sqlite,Spinner,我需要创建一个方法,将数据添加到数据库中,然后spinner应该显示它。正如我所测试的,显示工作正常,但我不知道如何告诉数据库,我只想创建一些数据一次。例如,我有一个名为chestExercises的表,其中有三列firstColumn、secondColumn和thirdColumn,它们都有值: firstColumn = "exerciseOne" secondColumn = "exerciseTwo" thirdColumn = "exerciseThree" 现在,我想从程序中只创

我需要创建一个方法,将数据添加到数据库中,然后spinner应该显示它。正如我所测试的,显示工作正常,但我不知道如何告诉数据库,我只想创建一些数据一次。例如,我有一个名为chestExercises的表,其中有三列firstColumn、secondColumn和thirdColumn,它们都有值:

firstColumn = "exerciseOne"
secondColumn = "exerciseTwo"
thirdColumn = "exerciseThree"
现在,我想从程序中只创建一次这些数据。正如我之前写的,我做了一些“测试”,数据库一直在创建这些数据,我不想有重复的数据。所以我如何“告诉”数据库,我只想做一次

数据库

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

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_2 + " TEXT," + COLUMN_3 + " TEXT," + COLUMN_4 + " TEXT)");

}

@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

public boolean insertData() {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_2, "1");
    contentValues.put(COLUMN_3, "2");
    contentValues.put(COLUMN_4, "3");
    long result = db.insert(TABLE_NAME, null, contentValues);

    if (result == -1) {
        return false;
    } else
        return true;
}

public List<String> getAllLabels() {
    List<String> labels = new ArrayList<String>();

    String selectQuery = "SELECT  * FROM " + TABLE_NAME;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {
            labels.add(cursor.getString(1));
            labels.add(cursor.getString(2));
            labels.add(cursor.getString(3));
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();

    return labels;
}
publicdatabasehelper(上下文){
super(上下文,数据库名称,null,1);
}
@凌驾
public void onCreate(SQLiteDatabase db){
db.execSQL(“创建表”+表名+”(ID整数主键自动递增,“+列2+”文本,“+列3+”文本,“+列4+”文本)”);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,inti,inti1){
db.execSQL(“如果存在删除表”+表名称);
onCreate(db);
}
公共布尔值insertData(){
SQLiteDatabase db=this.getWritableDatabase();
ContentValues ContentValues=新ContentValues();
contentValues.put(第2列,“1”);
contentValues.put(第3列,“2”);
contentValues.put(第4列,“3”);
long result=db.insert(表名称,null,contentValues);
如果(结果==-1){
返回false;
}否则
返回true;
}
公共列表getAllLabels(){
列表标签=新的ArrayList();
String selectQuery=“SELECT*FROM”+表格名称;
SQLiteDatabase db=this.getReadableDatabase();
Cursor Cursor=db.rawQuery(selectQuery,null);
if(cursor.moveToFirst()){
做{
labels.add(cursor.getString(1));
labels.add(cursor.getString(2));
labels.add(cursor.getString(3));
}while(cursor.moveToNext());
}
cursor.close();
db.close();
退货标签;
}
}

主要活动

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    spinner = (Spinner) findViewById(R.id.spinner);
    databaseHelper db = new databaseHelper(getApplicationContext());
    if (spinner == null){
        db.insertData();
    }else {
        Toast.makeText(MainActivity.this,
                "Your Message", Toast.LENGTH_LONG).show();
    }
    loadData();
}

public void loadData(){
    databaseHelper db = new databaseHelper(getApplicationContext());
    List<String> labels = db.getAllLabels();
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, labels);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(dataAdapter);
}

@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    String label = adapterView.getItemAtPosition(i).toString();
    Toast.makeText(adapterView.getContext(),"Selected: "+label,Toast.LENGTH_LONG).show();
}

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

}
}
公共类MainActivity扩展AppCompativeActivity实现AdapterView.OnItemSelectedListener{ 纺纱机; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 微调器=(微调器)findViewById(R.id.spinner); databaseHelper db=新的databaseHelper(getApplicationContext()); 如果(微调器==null){ db.insertData(); }否则{ Toast.makeText(MainActivity.this, “您的留言”,Toast.LENGTH_LONG.show(); } loadData(); } 公共void loadData(){ databaseHelper db=新的databaseHelper(getApplicationContext()); List labels=db.getAllLabels(); ArrayAdapter dataAdapter=新的ArrayAdapter(此, android.R.layout.simple\u微调器(项目、标签); dataAdapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉项); spinner.setAdapter(dataAdapter); } @凌驾 已选择公共视图(AdapterView AdapterView、View视图、int i、long l){ 字符串标签=adapterView.getItemAtPosition(i).toString(); Toast.makeText(adapterView.getContext(),“Selected:”+标签,Toast.LENGTH\u LONG.show(); } @凌驾 未选择公共无效(AdapterView AdapterView){ } } 选项1-具有合适的约束条件 一种选择是定义表,使组合的3列形成一个唯一的约束,从而在组合列存在时导致冲突

e、 g

在这种情况下,将不会插入相同的值组合(因为
insert
方法有效地使用了insert或IGNORE,因此如果出现冲突,将忽略insert)

选项2-检查表的行数 另一种方法是通过检查行数来检查表是否已经有任何数据

DatabaseHelper类中可以有一个方法,例如:-

public boolean isTableEmpty(String tablename) {
    return DatabaseUtils.queryNumEntries(this.getWritableDatabase(),tablename) < 1;
}
选项4-使用预加载的数据库。 使用此方法,您可以提供预加载的数据库(即存在基础数据)。第一次打开数据库时,数据库将放置在资产文件夹a中,并从资产文件夹复制到相关位置。该过程查看数据库是否存在,如果存在,则打开数据库,如果不存在,则复制数据库


您可以使用SQLiteOpenAssethelper来简化此过程,请参阅。在StackOverflow上也有很多例子说明了如何做到这一点。

我认为你想要的是不重复的数据。对吗?你的问题是矛盾的…一次创建意味着你只需要数据库中的一行。请更具体地说明一次的确切含义。这并不矛盾。我清楚地定义了它应该是什么样子,但好吧,我会重复一遍。我想创建一些方法,这些方法将生成特定行中的数据。例如,让我们假设数据库包含健身练习。数据库应该是这样的:Table name=chestExercises第一行:firstExercise=some exercise第二行:secondExercise=some exercise我想让它看起来像final,它不会被编辑,它只需要创建一次,直到用户删除应用程序(所以它应该只创建一次,这个数据将显示在微调器中)你可以用史莱德的偏好。。。。您可以检查应用程序是否第一次打开。。。如果是,则插入else加载数据
public boolean isTableEmpty(String tablename) {
    return DatabaseUtils.queryNumEntries(this.getWritableDatabase(),tablename) < 1;
}
public boolean insertDataCheckingForDuplicate(String value1, String value2, String value3) {
    SQLiteDatabase db = this.getWritableDatabase();
    int rowcount = 0;

    String whereclause = COLUMN_2 + "=? AND " + COLUMN_3 + "=? AND " + COLUMN_4 + "=?";
    String[] whereargs = new String[]{value1,value2,value3};
    Cursor csr = db.query(TABLE_NAME,null,whereclause,whereargs,null,null,null);
    rowcount = csr.getCount();
    csr.close();
    if (rowcount > 0) {
        return false;
    }

    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_2, value1);
    contentValues.put(COLUMN_3, value2);
    contentValues.put(COLUMN_4, value3);
    long result = db.insert(TABLE_NAME, null, contentValues);

    if (result == -1) {
        return false;
    } else
        return true;
}