GVKun编程网logo

在Android SQLite中重置自动增量

10

关于在AndroidSQLite中重置自动增量的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于AndroidSQLite中的多主键、android–限制SQLite中的行数、android

关于在Android SQLite中重置自动增量的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android SQLite中的多主键、android – 限制SQLite中的行数、android-DROP TABLE在sqlite中不起作用、android-sqlite – Android :: SQLite,没有找到这样的列?等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

在Android SQLite中重置自动增量

在Android SQLite中重置自动增量

我有这个方法将删除表中的所有行,但我也希望它重置自动增量,以便当添加新行时,它将再次启动.由于某些列不存在,我使用的sql语句不工作.我在做对吗?
private void rmvall() {

    sqliteDatabase db = appts.getWritableDatabase();
    db.delete(TABLE_NAME,null,null);
    db.execsql("DELETE FROM sqlITE_SEQUENCE WHERE NAME = " + TABLE_NAME);

}

解决方法

您的桌子名称上需要单引号,即
db.execsql("DELETE FROM sqlITE_SEQUENCE WHERE NAME = '" + TABLE_NAME + "'");

Android SQLite中的多主键

Android SQLite中的多主键

在sqlite for Android中,添加多主键的正确方法是什么?

目前我有:

String Create_table = "CREATE TABLE project ( keyId INTEGER PRIMARY KEY, keyName TEXT PRIMARY KEY)";

我想到的替代方法是:

   String Create_table = "CREATE TABLE project (keyID INTEGER, keyName TEXT, PRIMARY KEY(keyID, keyName))";

两者都有效吗?如果是这样,哪个更好?另外我如何禁止NULL值?

解决方法:

不,不可能为单个表创建多个主键.这是任何sql的基本规则.但是,您可以使用其他约束(如带有索引的UNIQUE)来实现此目的.

这不是有效的sql语法:

String Create_table = “CREATE TABLE project ( keyId INTEGER PRIMARY KEY, keyName TEXT PRIMARY KEY)”;

在其他方面,您可以为多列创建主键,如下所示:

Create Table yourTableName (col1, col2, col3, PRIMARY KEY (col1, col2));

How do I disallow NULL values?

您可以使用NOT NULL约束,它不允许您输入NULL值.

android – 限制SQLite中的行数

android – 限制SQLite中的行数

我有一种情况,我只想限制表中的50行.如果用户在此之后插入一个新行,则第一行(最先插入)将被删除并插入新行,因此计数保持不变.
我知道我可以有一个rowid字段,在插入新记录时我可以检查是否已有50行,所以删除最小的rowid然后插入新的rowid.但只是想知道是否有更好的解决方案,这样我就不必做3个数据库操作(1.查询#of行,2.删除最小值,3.插入)

解决方法

我知道一种有效的方法,但它有点难看.它依赖于精心构造的约束和播种数据库.为简洁起见,我只用了五行而不是50行.

create table test (
  row_num integer primary key
    check ((round(row_num) = row_num) and (row_num between 1 and 5)),other_columns char(1) not null default ''x'',row_timestamp timestamp 
    not null unique 
    default current_timestamp
);

表达式round(row_num = row_num)保证row_num列中有整数.否则,sqlite会让你在那里插入1.54或’wibble’.

other_columns列只是实际数据的占位符.

insert into test (row_num,row_timestamp) values
(1,''2015-01-01 08:00:01''),(2,''2015-01-01 08:00:02''),(3,''2015-01-01 08:00:03''),(4,''2015-01-01 08:00:04''),(5,''2015-01-01 08:00:05'');

实际的时间戳值并不意味着什么.不管怎样,还没有.像这样播种数据库意味着,从现在开始,您只需要执行更新语句.如果表开始时是空的,则必须处理插入和更新的不同逻辑.例如,您必须计算行以确定是插入还是更新.

create trigger update_timestamp
after update on test 
for each row
begin
  update test 
  set row_timestamp = strftime(''%Y-%m-%d %H:%M:%f'',''Now'')
  where row_num = OLD.row_num;
end;

“update_timestamp”触发器使sqlite以几分之一秒(%f)维护时间戳.可能取决于底层操作系统是否支持分数精度.

create trigger no_deletes
after delete on test
for each row
begin
  -- There might be a more elegant way to prevent deletes.
  -- This way just inserts exactly what a delete statement deletes.
  insert into test (row_num,other_columns,row_timestamp) 
  values (OLD.row_num,OLD.other_columns,OLD.row_timestamp);
end;

现在您可以更新数据了.您更新自己的数据,这里只是占位符other_columns,sqlite负责其余的工作.

update test 
set other_columns = ''b'' 
where row_timestamp = (select min(row_timestamp) from test);
select * from test order by row_timestamp desc;
row_num     other_columns  row_timestamp          
----------  -------------  -----------------------
1           b              2015-03-08 12:43:21.926
5           x              2015-01-01 08:00:05    
4           x              2015-01-01 08:00:04    
3           x              2015-01-01 08:00:03    
2           x              2015-01-01 08:00:02   

android-DROP TABLE在sqlite中不起作用

android-DROP TABLE在sqlite中不起作用

我尝试以编程方式删除表,但logcat中未显示任何错误,但没有任何结果:

这是我的数据库助手类:

public class database1 extends sqliteOpenHelper
{
    private static final String DB_Name="database";
    private static final int DB_Version=1;
    private static final String tbl_arrival1="arrival1";
    private static final String STRING_CREATE1 = "CREATE TABLE IF NOT EXISTS "+tbl_arrival1
            +" (_f_id INTEGER PRIMARY KEY AUTOINCREMENT, "
            +"f_date TEXT,"
            +"o_rder NUMERIC,"
            +"rem_com TEXT);";
    public database1 (Context ctx)
    {
        super(ctx,DB_Name,null,DB_Version);
    }
    @Override
    public void onCreate(sqliteDatabase database) {
        databaseQuery.onCreate(database);
      }
    public static class databaseQuery 
    {
        public static void onCreate(sqliteDatabase database)
        {   
            database.execsql("DROP TABLE IF EXISTS "+tbl_arrival1);
            database.execsql(STRING_CREATE1);
        }
    }
}

我在内容提供者中使用此数据库帮助器:

database1 DBHelper ;
public Uri insert(Uri uri, ContentValues values) 
    {
        long row_id;
        sqliteDatabase sqlDB = DBHelper.getWritableDatabase();
        row_id=sqlDB.insert(tbl_arrival1, null, values);
        if(row_id>0)
        {
            Uri _uri = ContentUris.withAppendedId(CONTENT_URI, row_id);
            getContext().getContentResolver().notifyChange(_uri, null);
            return _uri;
        }
        throw new sqlException("Failed to insert into "+uri);
    }

问题是,查询删除表无法正常工作!

所有建议和答案将不胜感激…

谢谢

解决方法:

创建数据库后,onCreate在创建时将仅工作一次,如果对旧版本进行了任何更改,则应使用onUpgrade()删除表

编辑
http://www.vogella.com/articles/AndroidSQLite/article.html

android-sqlite – Android :: SQLite,没有找到这样的列?

android-sqlite – Android :: SQLite,没有找到这样的列?

嘿所有我是一个新手安卓,并希望对此有所帮助?

android.database.sqlite.sqliteException:没有这样的列:asd :,编译时:DELETE FROM标签WHERE name = asd

这是我面临的错误,这是代码:

这是DBhelper中的方法:

/**
 * Delete a label table
 * */
public void deleteLabel(String label) {
    sqliteDatabase db = this.getWritableDatabase();

    // ContentValues values = new ContentValues();
    // values.remove(label);

    // Deleting Row
    db.delete(TABLE_LABELS,KEY_NAME + "=" + label,null);
    db.close(); // Closing database connection
}

这是调用该方法的主要Activity代码:

// for spinner onItemListener
// and here is what label is

final String label = parent.getItemAtPosition(position).toString();

Button dialogDeletelButton = (Button) dialog
                .findViewById(R.id.deleteButton);
        dialogDeletelButton.setonClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // database handler
                DatabaseHandler db = new DatabaseHandler(
                        getApplicationContext());

                // inserting new label into database
                db.deleteLabel(label);

                // Hiding the keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(inputLabel.getwindowToken(),0);

                // loading spinner without the deleted data
                loadSpinnerData();

            }
        });

解决方法

您几乎肯定需要引用’asd'(即代码中的label变量).如果它被引用,它是一个与名称列进行比较的字符串.

如果它没有引用,sql只会将其视为另一个列名.

您可以在以下活动中执行以下操作:

db.deleteLabel ("'" + label + "'");

但是更改辅助函数可能更干净:

db.delete (TABLE_LABELS,KEY_NAME + "='" + label + "'",null);

因为看起来你可能想要在那里的某个点处使用未加引号的标签(当前被注释掉的ContentValues内容).

今天关于在Android SQLite中重置自动增量的介绍到此结束,谢谢您的阅读,有关Android SQLite中的多主键、android – 限制SQLite中的行数、android-DROP TABLE在sqlite中不起作用、android-sqlite – Android :: SQLite,没有找到这样的列?等更多相关知识的信息可以在本站进行查询。

本文标签: