【问题标题】:How to update different values for multiple records in Sqlite android ?如何更新 Sqlite android 中多条记录的不同值?
【发布时间】:2018-06-01 06:59:55
【问题描述】:

我有一个表。我想用一列更改值(时间)多次复制相同的记录。我可以使用以下查询来复制记录。

insert into acsl_details(userID,aadhar_no 
,date ,time ,in_out 
,deptid ,emptype ,compy_code ,empmode ,name 
,upload_flag ,main_compcode ,utc_date ,utc_time ,time_zone ,latitude ,longitude )
select * from acsl_details;

现在我有一千个重复记录。现在我想更改时间列。我需要为所有一千条记录更新不同的时间。我搜索但无法理解这些查询。任何帮助..

【问题讨论】:

  • 您想根据哪些标准更改时间?比如 if (),那么时间应该是
  • @VladyslavMatviienkono 标准或条件我只想更新所有记录的时间.. 12 小时或 24 小时格式的时间没问题
  • 您说您 need to update different time for all thousand records 是否意味着您希望一条记录具有上午 5:00,而另一条记录具有上午 10 点?
  • @VladyslavMatviienko 对于 5:01:01 和 5:01:06 等所有记录的秒数需要不同
  • 以及您如何确定需要将哪个时间设置到哪个记录?

标签: android sql sqlite android-sqlite


【解决方案1】:

我相信以下内容会满足您的要求,即使用随机生成的时间更新 1000 个现有行的时间列,格式为 hh:mm:ss :-

WITH RECURSIVE newdata(id_of_row,newtime) AS (
    SELECT rowid AS id_of_row , 
         time(strftime('%s', '2000-01-01 00:00:00') +
             abs(random() % (strftime('%s', '2000-01-31 23:59:59') -
                                strftime('%s', '2000-01-01 00:00:00'))
                   ),
                'unixepoch') AS dt
    FROM acsl_details
)
UPDATE acsl_details 
    SET time = (
        SELECT newdata.newtime 
            FROM newdata 
            WHERE newdata.id_of_row = acsl_details.rowid
    );

核心代码/SQL 是:-

SELECT rowid AS id_of_row , 
 time(strftime('%s', '2000-01-01 00:00:00') +
            abs(random() % (strftime('%s', '2000-01-31 23:59:59') -
                            strftime('%s', '2000-01-01 00:00:00'))
               ),
            'unixepoch') AS dt
FROM acsl_details

这会从表中提取 rowid,并添加随机生成的时间,从而为 acsl_details 表的每一行生成两列(id_of_rowdt)。

这个,即 newdata 然后驱动更新。正在对 newdata 中存在的每一行进行更新。

测试

以下内容用于创建 100 个相同的行:-

DROP TABLE IF EXISTS acsl_details;
CREATE TABLE IF NOT EXISTS acsl_details (userID integer, aadhar_no INTEGER, date INTEGER, time INTEGER, in_out INTEGER, deptid INTEGER, compy_code INTEGER, empmode INTEGER, name TEXT, upload_flag INTEGER, main_compcode TEXT, utc_date INTEGER, utc_time, time_zone, latitude REAL, longitude REAL);

WITH RECURSIVE counter(userid,aadhar,date,time,in_out,deptid,compy_code,empmode,name,upload_flag,main_compcode,utc_date,utc_time,time_zone,latitude,longitude) AS (
    SELECT 1,11,'2018-01-01','10:20:00',0,111,56078,25,'FRED',4,'PARTIAL',5000,1324,'Z',123.56,56.234 
    UNION ALL SELECT userid,aadhar,date,time,in_out,deptid,compy_code,empmode,name,upload_flag,main_compcode,utc_date,utc_time,time_zone,latitude,longitude FROM counter LIMIT 100)  
    INSERT INTO  acsl_details SELECT * FROM counter;
    
SELECT * FROM acsl_details;

例如:-

按照解决方案运行代码后:-

【讨论】:

  • 如何在上次更新的表中创建用户 ID auoncrement?
  • Part1 你在定义列时使用userID INTEGER PRIMARY KEY,这使它成为rowid的别名,然后它可能会增加(不能保证你得到1 ,2,3.........但每个都是唯一的 64 位有符号整数)。例如CREATE TABLE IF NOT EXISTS acsl_details (userID INTEGER PRIMARY KEY, aadhar_no INTEGER, date INTEGER, time INTEGER, in_out INTEGER, deptid INTEGER, compy_code INTEGER, empmode INTEGER, name TEXT, upload_flag INTEGER, main_compcode TEXT, utc_date INTEGER, utc_time, time_zone, latitude REAL, longitude REAL);
  • Part2 然后你不插入一个值(null 是等效的)所以然后使用 :- WITH RECURSIVE counter(userid,aadhar,date,time,in_out,deptid,compy_code,empmode,name,upload_flag,main_compcode,utc_date,utc_time,time_zone,latitude,longitude) AS ( SELECT null,11,'2018-01-01','10:20:00',0,111,56078,25,'FRED',4,'PARTIAL',5000,1324,'Z',123.56,56.234 UNION ALL SELECT userid,aadhar,date,time,in_out,deptid,compy_code,empmode,name,upload_flag,main_compcode,utc_date,utc_time,time_zone,latitude,longitude FROM counter LIMIT 100) INSERT INTO acsl_details SELECT * FROM counter; (null not 1)
【解决方案2】:

只需在select 中列出您想要的值:

insert into acsl_details (userID,aadhar_no, date, time, in_out, 
                          deptid, emptype, compy_code, empmode, name 
                          upload_flag, main_compcode  utc_date, utc_time,
                          time_zone, latitude, longitude
                         )
    select userID, aadhar_no, date,
           <new time value goes here>,
           in_out, 
           deptid, emptype, compy_code, empmode, name 
           upload_flag, main_compcode  utc_date, utc_time,
           time_zone, latitude, longitude                         
    from acsl_details;

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2018-06-09
    • 2011-02-19
    相关资源
    最近更新 更多