for循环语句在数据库中创建行

时间:2014-04-08 19:14:21

标签: mysql sql database loops rows

我正在尝试使用for循环语句,如下所示:

for(int i=1; i <= 48; i++) { insertdiary("", ""); }

在我的MyDB文件中:

package com.cookbook.data;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.util.Log;

public class MyDB {
    private SQLiteDatabase db;
    private final Context context;
    private final MyDBhelper dbhelper;



    // Initializes MyDBHelper instance
    public MyDB(Context c){

        context = c;
        dbhelper = new MyDBhelper(context, Constants.DATABASE_NAME, null,
                                            Constants.DATABASE_VERSION);

    }


    // Closes the database connection
    public void close()
    {
        db.close();
    }

    // Initializes a SQLiteDatabase instance using MyDBhelper
    public void open() throws SQLiteException
    {

        try {
            db = dbhelper.getWritableDatabase();
        } catch(SQLiteException ex) {
            Log.v("Open database exception caught", ex.getMessage());
            db = dbhelper.getReadableDatabase();
        }
    }


    // Saves a diary entry to the database as name-value pairs in ContentValues instance
    // then passes the data to the SQLitedatabase instance to do an insert
    public long insertdiary(String title, String content)
    {

        try{
            ContentValues newTaskValue = new ContentValues();
            newTaskValue.put(Constants.TITLE_NAME,  title);
            newTaskValue.put(Constants.CONTENT_NAME, content);
            newTaskValue.put(Constants.DATE_NAME,     java.lang.System.currentTimeMillis());            
            return db.insert(Constants.TABLE_NAME,  null, newTaskValue);
        } catch(SQLiteException ex) {
            Log.v("Insert into database exception caught",
                    ex.getMessage());
            return -1;
        }

    }

    // updates a diary entry (existing row)
        public boolean updateDiaryEntry(String title, long rowId)
        {

            ContentValues newValue = new ContentValues();
            newValue.put(Constants.TITLE_NAME, title);

            return db.update(Constants.TABLE_NAME, newValue, Constants.KEY_ID + "=" +     rowId, null)>0;

        }

    // Reads the diary entries from database, saves them in a Cursor class and returns     it from the method
    public Cursor getdiaries()
    {
        Cursor c = db.query(Constants.TABLE_NAME, null, null,
                            null, null, null, null);
        return c;
    }

}

我的目标是在数据库或表首次创建时创建48个空行,以便我可以进一步更新这些行而不是创建新条目。不幸的是,我尝试使用此代码是不幸的,给我错误或创建比48更多的行。 是否有人可以帮助我利用这些代码在数据库或表第一次创建时创建48行? 我感谢所有的帮助。 稻谷

2 个答案:

答案 0 :(得分:0)

除非确实有一些严格的规则来管理创建48个空行的要求,否则创建它们实际上是绝对错误的做法。当需要将数据插入其中时,根据需要创建它们。

答案 1 :(得分:0)

我最初在mysql中做过这个。创建SQLFiddle时遇到了麻烦,所以我也创建了一个SQLite版本。

SQLFiddle 。将随后的所有内容压缩到8K,SQLFiddle限制,是有趣的&#39; ; - /

SQLite 版本,除了&#39; create table&#39;之外完全相同。声明,如果需要,我会提供。这将是一个数据库文件的下载,了解,所有机器都是相同的。如果需要,我还可以提供创建脚本。

<强>目的:

据我所知,这个想法是显示约会&#39;那天分为48,30分钟。

要求仅记录实际约会

我把它描绘成少数部门,在事件发生的白天记录约会。在我的示例数据中,访问的人。

以下是显示约会的查询:

SELECT * 
FROM department_appointments_view dav
WHERE dav.the_date = '2014-04-11'
 AND  dav.department_id  = 1
 AND  dav.time_slot_id BETWEEN 12 AND 20;

以下是示例输出:

appointment_id  department_id  department_code  the_date             time_slot_id  start_time  attendee           reason                 duration  
--------------  -------------  ---------------  -------------------  ------------  ----------  -----------------  ---------------------  ----------
             0              1  dept_01          2014-04-11 00:00:00            12  05:30:00                                                      30
             0              1  dept_01          2014-04-11 00:00:00            13  06:00:00                                                      30
             1              1  dept_01          2014-04-11 00:00:00            14  06:30:00    Catherine Tramell  to see you                     30
             0              1  dept_01          2014-04-11 00:00:00            15  07:00:00                                                      30
             2              1  dept_01          2014-04-11 00:00:00            16  07:30:00    Buddy Ackerman     to see them                    30
             0              1  dept_01          2014-04-11 00:00:00            17  08:00:00                                                      30
             0              1  dept_01          2014-04-11 00:00:00            18  08:30:00                                                      30
             3              1  dept_01          2014-04-11 00:00:00            19  09:00:00    Ivan Drago         to visit someone else          30
             0              1  dept_01          2014-04-11 00:00:00            20  09:30:00                                                      30

因此,输入约会的主表是:

CREATE TABLE `department_appointments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `department_id` int(11) NOT NULL,
  `the_date` date NOT NULL,
  `time_slot_id` int(11) NOT NULL,
  `attendee` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `reason` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `duration` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `dept_fk` (`department_id`),
  CONSTRAINT `dept_fk` FOREIGN KEY (`department_id`) REFERENCES `departments` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

这是 only 表,其中输入了约会信息。

示例数据:

    id  department_id  the_date    time_slot_id  attendee                 reason                 duration  
------  -------------  ----------  ------------  -----------------------  ---------------------  ----------
     1              1  2014-04-11            14  Catherine Tramell        to see you                     30
     2              1  2014-04-11            16  Buddy Ackerman           to see them                    30
     3              1  2014-04-11            19  Ivan Drago               to visit someone else          30

我们需要一些支持表:

部门表:

CREATE TABLE `departments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `department_code` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `title` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

示例数据:

   id  department_code  title                        
------  ---------------  -----------------------------
     1  dept_01          Dept 01 - The Widget Makers  
     2  dept_02          Dept 02 - For Bar Workers    

日历:这只是一个包含日期的表格。我的测试数据是4月份。

CREATE TABLE `the_calendar` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `the_date` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Sample data:
    id  the_date             
------  ---------------------
     1  2014-04-01 00:00:00  
     2  2014-04-02 00:00:00  
     3  2014-04-03 00:00:00  
     4  2014-04-04 00:00:00  

read_only_time_slots 表。它有48行,开始时间。此表格只读,永不更新或复制或任何内容。

CREATE TABLE `read_only_time_slots` (
  `time_slot_id` int(11) NOT NULL,
  `start_time` time NOT NULL,
  `duration` int(11) NOT NULL,
  PRIMARY KEY (`time_slot_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

示例数据:

time_slot_id  start_time  duration  
------------  ----------  ----------
           1  00:00:00            30
           2  00:30:00            30
           3  01:00:00            30


----------------------

您现在需要一些查询才能运行此批次。请注意,我们会利用数据库引擎尽可能地执行笛卡儿产品。它将从上面的表中为我们生成所有需要的行。

现在,为了简化信息的使用,我使用了&#39;观看&#39;。这样对我来说不那么困惑。

观看次数

第一个是: time_slot_view

CREATE VIEW `time_slot_view` AS (
SELECT ts.time_slot_id  AS time_slot_id,
       ts.start_time    AS start_time,
       ts.duration      AS duration
FROM read_only_time_slots ts 
ORDER BY ts.time_slot_id ASC)

接下来是: department_calendar_view

每天为每个部门返回空时隙。

CREATE VIEW `department_calendar_view` AS (
SELECT
  `d`.`id`              AS `department_id`,
  `d`.`department_code` AS `department_code`,
  `c`.`the_date`        AS `the_date`,
  `tsv`.`time_slot_id`  AS `time_slot_id`,
  `tsv`.`start_time`    AS `start_time`,
  `tsv`.`duration`      AS `duration`
FROM ((`the_calendar` `c`
    JOIN `time_slot_view` `tsv`)
   JOIN `departments` `d`)
ORDER BY `d`.`department_code`,`c`.`the_date`,`tsv`.`time_slot_id`)

最后:有一个使用以上所有内容的视图:

department_appointments_view

这可能可以作为外部联接来完成。我刚刚使用了两个查询和一个联合。

CREATE VIEW `department_appointments_view` AS 
SELECT  da.id                 AS appointment_id,
        dcv.`department_id`   AS department_id, 
        dcv.`department_code` AS department_code, 
    da.`the_date`         AS the_date, 
    da.`time_slot_id`     AS time_slot_id, 
        dcv.start_time        AS start_time,
    da.`attendee`         AS attendee, 
    da.`reason`           AS reason, 
    da.`duration`         AS duration 
FROM 
    `department_appointments` AS da
INNER JOIN department_calendar_view AS dcv
       ON  da.department_id = dcv.department_id
       AND da.the_date = dcv.the_date
       AND da.time_slot_id = dcv.time_slot_id  
UNION   
SELECT 0,
       dcv.department_id,
       dcv.`department_code` , 
       dcv.the_date,
       dcv.time_slot_id,
       dcv.start_time,
       ''    AS attendee,
       ''    AS reason, 
       dcv.`duration`
FROM department_calendar_view AS dcv 
WHERE NOT EXISTS (SELECT 1 
                  FROM  `department_appointments` AS da
                  WHERE  da.department_id = dcv.department_id
                   AND   da.the_date = dcv.the_date
                   AND   da.time_slot_id = dcv.time_slot_id)
ORDER BY department_code, the_date, time_slot_id;