精华内容
下载资源
问答
  • 创建或者更新文档时,会对文档进行分词 2,Search time analysis. 查询时,对查询语句分词 指定查询时使用哪个分词器的方式有:  - 查询时通过analyzer指定分词器 GET test_index/_search { "query": { ...

    analyzer  

    分词器使用的两个情形:  
    1,Index time analysis.  创建或者更新文档时,会对文档进行分词
    2,Search time analysis.  查询时,对查询语句分词

     

    - 查询时通过analyzer指定分词器

    POST test_index/_search
    {
      "query": {
        "match": {
          "name": {
            "query": "lin",
            "analyzer": "standard"
          }
        }
      }
    }

    - 创建index mapping时指定search_analyzer

    PUT test_index
    {
      "mappings": {
        "doc": {
          "properties": {
            "title":{
              "type": "text",
              "analyzer": "whitespace",
              "search_analyzer": "standard"
            }
          }
        }
      }
    }

    索引时分词是通过配置 Index mapping中的每个字段的参数analyzer指定的

    不指定分词时,会使用默认的standard分词器

    注意:

     明确字段是否需要分词,不需要分词的字段将type设置为keyword,可以节省空间和提高写性能。

    _analyzer api    

    POST _analyze
    {
        "analyzer": "standard",
        "text": "this is a test"
    }
    # 可以查看text的内容使用standard分词后的结果
    
    {
    "tokens": 
        [
            {
                "token": "this",
                "start_offset": 0,
                "end_offset": 4,
                "type": "<ALPHANUM>",
                "position": 0
            },
            {
                "token": "is",
                "start_offset": 5,
                "end_offset": 7,
                "type": "<ALPHANUM>",
                "position": 1
            },
            {
                "token": "a",
                "start_offset": 8,
                "end_offset": 9,
                "type": "<ALPHANUM>",
                "position": 2
            },
            {
                "token": "test",
                "start_offset": 10,
                "end_offset": 14,
                "type": "<ALPHANUM>",
                "position": 3
            }
        ]
    }
    

     

    设置analyzer

    PUT test
    {
        "settings": {
            "analysis": { #自定义分词器
                "analyzer": { # 关键字
                    "my_analyzer":{ # 自定义的分词器
                        "type":"standard", #分词器类型standard
                        "stopwords":"_english_" #standard分词器的参数,默认的stopwords是\_none_
                    }
                }
            }
        },
        "mappings": {
            "doc":{
                "properties": {
                    "my_text":{
                        "type": "text",
                        "analyzer": "standard", # my_text字段使用standard分词器
                        "fields": {
                            "english":{ # my_text.english字段使用上面自定义的my_analyzer分词器
                                "type": "text",
                                "analyzer": "my_analyzer"
                            }
                        }
                    }
                }
            }
        }
    }
    
    POST test/_analyze
    {
        "field": "my_text", # my_text字段使用的是standard分词器
        "text": ["The test message."]
    }
    
    -------------->[the,test,message]
    
    POST test/_analyze
    {
        "field": "my_text.english", #my_text.english使用的是my_analyzer分词器
        "text": ["The test message."]
    }
    
    ------------>[test,message]
    

    ES内置了很多种analyzer。比如:

    • standard  由以下组成
      • tokenizer:Standard Tokenizer

    token filter:Standard Token Filter,Lower Case Token Filter,Stop Token Filter 

    analyzer API测试 :
    POST _analyze
    {
      "analyzer": "standard",
      "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
    }

    得到结果:

    {
      "tokens": [
        {
          "token": "the",
          "start_offset": 0,
          "end_offset": 3,
          "type": "<ALPHANUM>",
          "position": 0
        },
        {
          "token": "2",
          "start_offset": 4,
          "end_offset": 5,
          "type": "<NUM>",
          "position": 1
        },
        {
          "token": "quick",
          "start_offset": 6,
          "end_offset": 11,
          "type": "<ALPHANUM>",
          "position": 2
        },
        {
          "token": "brown",
          "start_offset": 12,
          "end_offset": 17,
          "type": "<ALPHANUM>",
          "position": 3
        },
        {
          "token": "foxes",
          "start_offset": 18,
          "end_offset": 23,
          "type": "<ALPHANUM>",
          "position": 4
        },
        {
          "token": "jumped",
          "start_offset": 24,
          "end_offset": 30,
          "type": "<ALPHANUM>",
          "position": 5
        },
        {
          "token": "over",
          "start_offset": 31,
          "end_offset": 35,
          "type": "<ALPHANUM>",
          "position": 6
        },
        {
          "token": "the",
          "start_offset": 36,
          "end_offset": 39,
          "type": "<ALPHANUM>",
          "position": 7
        },
        {
          "token": "lazy",
          "start_offset": 40,
          "end_offset": 44,
          "type": "<ALPHANUM>",
          "position": 8
        },
        {
          "token": "dog's",
          "start_offset": 45,
          "end_offset": 50,
          "type": "<ALPHANUM>",
          "position": 9
        },
        {
          "token": "bone",
          "start_offset": 51,
          "end_offset": 55,
          "type": "<ALPHANUM>",
          "position": 10
        }
      ]
    }

    whitespace  空格为分隔符

    POST _analyze
    {
      "analyzer": "whitespace",
      "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
    }
    -->  [ The,2,QUICK,Brown-Foxes,jumped,over,the,lazy,dog's,bone. ]

    simple

    POST _analyze
    {
      "analyzer": "simple",
      "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
    }
    ---> [ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]
    
    

    stop   默认stopwords用_english_ 

    POST _analyze
    {
        "analyzer": "stop",
        "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
    }
    
    -->[ quick, brown, foxes, jumped, over, lazy, dog, s, bone ]
    
    可选参数:
    # stopwords
    # stopwords_path

    keyword  不分词的

    POST _analyze
    {
      "analyzer": "keyword",
      "text": ["The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."]
    }
    得到  "token": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." 一条完整的语句

     

    第三方analyzer插件---中文分词(ik分词器)

    es内置很多分词器,但是对中文分词并不友好,例如使用standard分词器对一句中文话进行分词,会分成一个字一个字的。这时可以使用第三方的Analyzer插件,比如 ik、pinyin等。这里以ik为例

    1,首先安装插件,重启es:

    # bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip
    # /etc/init.d/elasticsearch restart

    2,使用示例:

    GET _analyze
    {
      "analyzer": "ik_max_word",
      "text": "你好吗?我有一句话要对你说呀。"
    }
    
    
    得到:
    {
    "tokens": [
    {
    "token": "你好",
    "start_offset": 0,
    "end_offset": 2,
    "type": "CN_WORD",
    "position": 0
    },
    {
    "token": "好吗",
    "start_offset": 1,
    "end_offset": 3,
    "type": "CN_WORD",
    "position": 1
    },
    {
    "token": "我",
    "start_offset": 4,
    "end_offset": 5,
    "type": "CN_CHAR",
    "position": 2
    },
    {
    "token": "有",
    "start_offset": 5,
    "end_offset": 6,
    "type": "CN_CHAR",
    "position": 3
    },
    {
    "token": "一句话",
    "start_offset": 6,
    "end_offset": 9,
    "type": "CN_WORD",
    "position": 4
    },
    {
    "token": "一句",
    "start_offset": 6,
    "end_offset": 8,
    "type": "CN_WORD",
    "position": 5
    },
    {
    "token": "一",
    "start_offset": 6,
    "end_offset": 7,
    "type": "TYPE_CNUM",
    "position": 6
    },
    {
    "token": "句话",
    "start_offset": 7,
    "end_offset": 9,
    "type": "CN_WORD",
    "position": 7
    },
    {
    "token": "句",
    "start_offset": 7,
    "end_offset": 8,
    "type": "COUNT",
    "position": 8
    },
    {
    "token": "话",
    "start_offset": 8,
    "end_offset": 9,
    "type": "CN_CHAR",
    "position": 9
    },
    {
    "token": "要对",
    "start_offset": 9,
    "end_offset": 11,
    "type": "CN_WORD",
    "position": 10
    },
    {
    "token": "你",
    "start_offset": 11,
    "end_offset": 12,
    "type": "CN_CHAR",
    "position": 11
    },
    {
    "token": "说呀",
    "start_offset": 12,
    "end_offset": 14,
    "type": "CN_WORD",
    "position": 12
    }
    ]
    }

    参考:https://github.com/medcl/elasticsearch-analysis-ik

     

     

    还可以用内置的 character filter, tokenizer, token filter 组装一个analyzer(custom analyzer)

    custom  定制analyzer,由以下几部分组成

    • 0个或多个character filters
    • 1个tokenizer
    • 0个或多个 token filters
    PUT t_index
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_analyzer":{
              "type":"custom",
              "tokenizer":"standard",
              "char_filter":["html_strip"],
              "filter":["lowercase"]
            }
          }
        }
      }
    }
    
    POST t_index/_analyze
    {
      "analyzer": "my_analyzer",
      "text": ["The 2 QUICK Brown-Foxes jumped over the lazy dog's <b> bone.</b>"]
    }
    
    得到:[the,2,quick,brown,foxes,jumped,over,the,lazy,dog's,bone]

    自定义分词器

    自定义分词需要在索引的配置中设定,如下所示:

    PUT test_index
    {
        "settings": {
            "analysis": { # 分词设置,可以自定义
                "char_filter": {}, #char_filter 关键字
                "tokenizer": {}, #tokenizer 关键字
                "filter": {}, #filter 关键字
                "analyzer": {} #analyzer 关键字
            }
        }
    }
    

    character filter  在tokenizer之前对原始文本进行处理,比如增加,删除,替换字符等

    会影响后续tokenizer解析的position和offset信息

    html strip  除去html标签和转换html实体

    • 参数:escaped_tags不删除的标签
    POST _analyze
    {
      "tokenizer": "keyword",
      "char_filter": ["html_strip"],
      "text": ["<p>I&apos;m so <b>happy</b>!</p>"]
    }
    
    得到:
          "token": """
    
    I'm so happy!
    
    """
    
    #配置示例
    PUT t_index
    {
      "settings": {
        "analysis": {
          "analyzer": {  #关键字
            "my_analyzer":{   #自定义analyzer
              "tokenizer":"keyword",
              "char_filter":["my_char_filter"]
            }
          },
          "char_filter": {  #关键字
            "my_char_filter":{   #自定义char_filter
              "type":"html_strip",
              "escaped_tags":["b"]  #不从文本中删除的HTML标记数组
            }
          }
        }
      }
    }
    
    POST t_index/_analyze
    {
      "analyzer": "my_analyzer",
      "text": ["<p>I&apos;m so <b>happy</b>!</p>"]
    }
    
    
    得到:
          "token": """
    
    I'm so <b>happy</b>!
    
    """,

    mapping    映射类型,以下参数必须二选一

    • mappings 指定一组映射,每个映射格式为 key=>value
    • mappings_path 绝对路径或者相对于config路径   key=>value
    PUT t_index
    {
        "settings": {
            "analysis": {
                "analyzer": { #关键字
                    "my_analyzer":{ #自定义分词器
                            "tokenizer":"standard",
                            "char_filter":"my_char_filter"
                        }
                },
                "char_filter": { #关键字
                    "my_char_filter":{  #自定义char_filter
                        "type":"mapping",
                        "mappings":[ #指明映射关系
                        ":)=>happy",
                        ":(=>sad"
                        ]
                    }
                }
            }
        }
    }
    
    POST t_index/_analyze
    {
        "analyzer": "my_analyzer",
        "text": ["i am so :)"]
    }
    
    
    得到 [i,am,so,happy]
    

    pattern replace

    • pattern参数  正则
    • replacement 替换字符串 可以使用$1..$9
    • flags  正则标志

    tokenizer  将原始文档按照一定规则切分为单词

    • standard
      • 参数:max_token_length,最大token长度,默认是255
    PUT t_index
    {
        "settings": {
            "analysis": {
                "analyzer": {
                    "my_analyzer":{
                        "tokenizer":"my_tokenizer"
                    }
                },
                "tokenizer": {
                    "my_tokenizer":{
                            "type":"standard",
                            "max_token_length":5
                    }
                }
            }
        }
    }
    
    POST t_index/_analyze
    {
        "analyzer": "my_analyzer",
        "text": ["The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."]
    }
    
    得到 [ The, 2, QUICK, Brown, Foxes, jumpe, d, over, the, lazy, dog's, bone ]
    # jumped 长度为6 在5这个位置被分割
    

    letter    非字母时分成多个terms

    POST _analyze
    {
      "tokenizer": "letter",
      "text": ["The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."]
    }
    
    得到 [ The, QUICK, Brown, Foxes, jumped, over, the, lazy, dog, s, bone ]

    lowcase  跟letter tokenizer一样 ,同时将字母转化成小写

    POST _analyze
    {
      "tokenizer": "lowercase",
      "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
    }
    
    得到  [ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]

    whitespace   按照空白字符分成多个terms

    • 参数:max_token_length
    POST _analyze
    {
        "tokenizer": "whitespace",
        "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
    }
     
    得到 [ The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone. ]

    keyword   空操作,输出完全相同的文本

    • 参数:buffer_size,单词一个term读入缓冲区的长度,默认256
    POST _analyze
    {
        "tokenizer": "keyword",
        "text": ["The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."]
    }
    
    得到"token": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." 一个完整的文本

    token filter   针对tokenizer 输出的单词进行增删改等操作

    lowercase  将输出的单词转化成小写

    POST _analyze
    {
        "filter": ["lowercase"],
        "text": ["The 2 QUICK Brown-Foxes jumped over the lazy dog's bone"]
    }
    --->
    "token": "the 2 quick brown-foxes jumped over the lazy dog's bone"
    
    PUT t_index
    {
        "settings": {
            "analysis": {
                "analyzer": {
                    "my_analyzer":{
                        "type":"custom",
                        "tokenizer":"standard",
                        "filter":"lowercase"
                    }
                }
            }
        }
    }
    
    POST t_index/_analyze
    {
      "analyzer": "my_analyzer",
        "text": ["The 2 QUICK Brown-Foxes jumped over the lazy dog's bone"]
    }

    stop  从token流中删除stop words 。

    参数有:

    # stopwords   要使用的stopwords, 默认_english_
    # stopwords_path
    # ignore_case   设置为true则为小写,默认false
    # remove_trailing
    PUT t_index
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_analyzer":{
              "type":"custom",
              "tokenizer":"standard",
              "filter":"my_filter"
            }
          },
          "filter": {
            "my_filter":{
              "type":"stop",
              "stopwords":["and","or","not"]
            }
          }
        }
      }
    }
    
    POST t_index/_analyze
    {
      "analyzer": "my_analyzer",
      "text": ["lucky and happy not sad"]
    }
    
    -------------->
    [lucky,happy,sad]
    

     

    展开全文
  • 创建 更新 接口 一直 在 LOADING 查询删除 接口 参数 输入框 爆红 创建 更新 解决方式 错误的写法 @ApiOperation(value = "创建用户基本信息", httpMethod = "POST") @ApiImplicitParams(value = ...

    创建 更新 接口  一直 在 LOADING

     

    查询删除 接口

    参数 输入框 爆红 

     

     

    创建 更新 解决方式 

    错误的写法

        @ApiOperation(value = "创建用户基本信息", httpMethod = "POST")
        @ApiImplicitParams(value = {
                @ApiImplicitParam(name = "UserDTO", value = "用户信息", required = true, dataType = "UserSelfBaseCatalogDTO"),
        })
        @PostMapping("/create-one")
        ResultData createOne(@RequestBody @Validated(User.Create.class)UserDTO userDTO) {
            return userService.createOne(userDTO);
        }

    正确的写法

        @ApiOperation(value = "创建用户基本信息", httpMethod = "POST")
        @ApiImplicitParams(value = {
                @ApiImplicitParam(name = "userDTO", value = "用户信息", required = true, dataType = "UserSelfBaseCatalogDTO"),
        })
        @PostMapping("/create-one")
        ResultData createOne(@RequestBody @Validated(User.Create.class)UserDTO userDTO) {
            return userService.createOne(userDTO);
        }

    原因就是  @ApiImplicitParam 的 name 属性  要跟参数一致。 更新同理

    删除查询解决方式

    原因是  @ApiImplicitParams 中的  dataType 改为 写错了   改为 String 或者 Long 就可以了 之前 用了Ineger ,所以不对 还是要按照规范去操作。

    关于其中@Api和@ApiOperation等的详细解释如下:

    作用范围API使用位置
    对象属性@ApiModelProperty用于出入参数对象的字段上
    协议集描述@Api用于Controller类上
    协议描述@ApiOperation用在Controller的方法上
    Response集@ApiResponses用在controller的方法上
    Response@ApiResponse用在 @ApiResponses里边
    非对象参数集@ApiImplicitParams用在controller的方法上
    非对象参数描述@ApiImplicitParam用在@ApiImplicitParams的方法里边
    描述返回对象的意义@ApiModel用在返回对象类上

     

    关于参数的详细解释

    属性取值作用
    paramType 查询参数类型
     path以地址的形式提交数据
     query直接跟参数完成自动映射赋值
     body以流的形式提交 仅支持POST
     header参数在request headers 里边提交
     form以form表单的形式提交 仅支持POST
    dataType 参数的数据类型 只作为标志说明,并没有实际验证
     Long 
     String 
    name 接收参数名(必须与方法中参数名一致)
    value 接收参数的意义描述(描述信息)
    required 参数是否必填
     true必填
     false非必填
    defaultValue 默认值

     

    展开全文
  • NSLog(@"数据更新失败"); NSAssert(0, @"error updating :%s",errorMsg); sqlite3_finalize(stmt); sqlite3_close(database); 当然,你也可以用大家熟知的,直接把数据写在要执行的sql语句后面,如下: ...


    众所周知,sqlite3是ios数据存储其一,具体优点和缺点,我就不再赘述,请大家搜索之。



    一、必备条件

    在ios项目中使用sqlite需要添加  libsqlite3.dylib 库



    二、简单介绍常用方法

    sqlite3          *db, 数据库句柄,跟文件句柄FILE很类似
    sqlite3_stmt      *stmt, 这个相当于ODBC的Command对象,用于保存编译好的SQL语句
    sqlite3_open(),   打开数据库,没有数据库时创建。
    sqlite3_exec(),   执行非查询的sql语句
    Sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。
    Sqlite3_close(), 关闭数据库文件
    还有一系列的函数,用于从记录集字段中获取数据,如
    sqlite3_column_text(), 取text类型的数据。
    sqlite3_column_blob(),取blob类型的数据
    sqlite3_column_int(), 取int类型的数据


    三、创建(或打开)数据库

    3-1首先自定义一个方法,返回我们当前应用程序沙盒目录(也就是说希望数据库保存在哪里)

    -(NSString *) dataFilePath{
    
       NSArray *path =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    
        NSString *document = [path objectAtIndex:0];
    
        return [document stringByAppendingPathComponent:TABLENAME];//'persion.sqlite'
    
    }

    3-2 在指定位置 创建或打开一个数据库

    SQLITE_OK是sqlite3的一个常量,代表操作执行成功

        //SQLite3
        
        sqlite3 *database;
        if (sqlite3_open([[self dataFilePath] UTF8String], &database)!=SQLITE_OK) {
            sqlite3_close(database);
            NSAssert(0, @"open database faid!");
            NSLog(@"数据库创建失败!");
        }

    【注意】由于sqlite3是基于C语言编写的,而不是纯粹的object-c,所以有关字符串,我们不能使用NSString,因为它不识别,所以只能用c语言的字符串,char*,好在Nsstring提供了转换的方法,那就是 UTF8String。


    上图便是我们创建的数据库在app中的指定位置。




    四、创建一张表

        NSString *ceateSQL = @"CREATE TABLE IF NOT EXISTS PERSIONINFO(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, AGE INTEGER, SEX TEXT, WEIGHT INTEGER, ADDRESS TEXT)";
    
        char *ERROR;
        
        if (sqlite3_exec(database, [ceateSQL UTF8String], NULL, NULL, &ERROR)!=SQLITE_OK){
            sqlite3_close(database);
            NSAssert(0, @"ceate table faild!");
            NSLog(@"表创建失败");
        }
        
    我创建了一张名为PERSIONINFO的数据库表,其中有一个自增的ID,和NAME,AGE,SEX,WEIGTH,ADDRESS五个属性。


    五、查询表数据

        NSString *quary = @"SELECT * FROM PERSIONINFO";//SELECT ROW,FIELD_DATA FROM FIELDS ORDER BY ROW
        sqlite3_stmt *stmt;
        if (sqlite3_prepare_v2(database, [quary UTF8String], -1, &stmt, nil) == SQLITE_OK) {
            
            while (sqlite3_step(stmt)==SQLITE_ROW) {
                
                char *name = (char *)sqlite3_column_text(stmt, 1);
                NSString *nameString = [[NSString alloc] initWithUTF8String:name];
                self.nameTextField.text = nameString;
                [nameString release];
                
                int age = sqlite3_column_int(stmt, 2);
                self.ageTextField.text = [NSString stringWithFormat:@"%d",age];
                
                char *sex = (char *)sqlite3_column_text(stmt, 3);
                NSString *sexString = [[NSString alloc] initWithUTF8String:sex];
                self.sexTextField.text = sexString;
                [sexString release];
                
                int weight = sqlite3_column_int(stmt, 4);
                self.weightTextField.text = [NSString stringWithFormat:@"%d",weight];
                
                
                char *address = (char *)sqlite3_column_text(stmt, 5);
                NSString *addressString = [[NSString alloc] initWithUTF8String:address];
                self.addressTextField.text = addressString;
                [addressString release];
                
                
            }
            
            sqlite3_finalize(stmt);
        }
        //用完了一定记得关闭,释放内存
        sqlite3_close(database);
    sqlite3_prepare_v2是执行查询的方法,当查询语句执行成功时,使用sqlite3_step当游标指向每一行SQLITE_ROW时,我们开始读取数据

    sqlite_3_column_text可以读取字符串类型的数据,参数二为column号,sqlite_3column_int读取int类型数据,其它的就不举例了,大家可以尝试。



    六、保存,插入数据

        char *update = "INSERT OR REPLACE INTO PERSIONINFO(NAME,AGE,SEX,WEIGHT,ADDRESS)""VALUES(?,?,?,?,?);";
        //上边的update也可以这样写:
        //NSString *insert = [NSString stringWithFormat:@"INSERT OR REPLACE INTO PERSIONINFO('%@','%@','%@','%@','%@')VALUES(?,?,?,?,?)",NAME,AGE,SEX,WEIGHT,ADDRESS];
    
        char *errorMsg = NULL;
        sqlite3_stmt *stmt;
        
        if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {
            
            //【插入数据】在这里我们使用绑定数据的方法,参数一:sqlite3_stmt,参数二:插入列号,参数三:插入的数据,参数四:数据长度(-1代表全部),参数五:是否需要回调
            sqlite3_bind_text(stmt, 1, [self.nameTextField.text UTF8String], -1, NULL);
            sqlite3_bind_int(stmt, 2, [self.ageTextField.text intValue]);
            sqlite3_bind_text(stmt, 3, [self.sexTextField.text UTF8String], -1, NULL);
            sqlite3_bind_int(stmt, 4, [self.weightTextField.text integerValue]);
            sqlite3_bind_text(stmt, 5, [self.addressTextField.text UTF8String], -1, NULL);
        }
        if (sqlite3_step(stmt) != SQLITE_DONE)
        NSLog(@"数据更新失败");
        NSAssert(0, @"error updating :%s",errorMsg);
        
         sqlite3_finalize(stmt);
        
        sqlite3_close(database);
    

    当然,你也可以用大家熟知的,直接把数据写在要执行的sql语句后面,如下:

        NSString *insert = [NSString stringWithFormat:@"INSERT OR REPLACE INTO PERSIONINFO('%@','%@','%@','%@','%@')VALUES('%@','%d','%@','%d','%@')",NAME,AGE,SEX,WEIGHT,ADDRESS,@"小杨",23,@"man",65,@"中国北京,haidian,shangdi,xinxiRoad,100014"];
        
        //执行语句
        if (sqlite3_exec(database, [insert UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
            sqlite3_close(database);
        }
        

    这样看着是不是就轻松很多了呢?



    七:运行效果:



    demo中我在每回打开APP时,在viewdidload里,读取数据库,如果有数据,赋值到相应的属性,当用户按下home键后,及时保存当前数据。也就是说,模拟一个游戏,当我们来电话时或是按下home键做别的事情时,一定要为用户保存当前进度和数据,不然下次打开游戏,又归零了?


    demo地址:

    http://download.csdn.net/detail/mad1989/5752207



    展开全文
  • 本文对数据库的建立、更新,数据的插入、更新查询、删除,及事务的处理进行示例讲解。 代码里有注释帮助理解。 实现代码: activity_main.xml <?xml version="1.0" encoding="utf-8"?> <...

    运行效果:

    本文对数据库的建立、更新,数据的插入、更新、查询、删除,及事务的处理进行示例讲解。

    代码里有注释帮助理解。

    实现代码:

    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:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.example.administrator.dbexcise.MainActivity">
    
        <Button
            android:id="@+id/bt1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Create DB"
            android:textAllCaps="false"
            android:onClick="testCreateDB"/>
    
        <Button
            android:id="@+id/bt2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Insert Date"
            android:textAllCaps="false"
            android:onClick="testInsertDate"/>
    
        <Button
            android:id="@+id/bt3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Delete Date"
            android:textAllCaps="false"
            android:onClick="testDeleteDate"/>
    
        <Button
            android:id="@+id/bt4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Update Date"
            android:textAllCaps="false"
            android:onClick="testUpdateDate"/>
    
        <Button
            android:id="@+id/bt5"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Query Date"
            android:textAllCaps="false"
            android:onClick="testQueryDate"/>
    
        <Button
            android:id="@+id/bt6"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Handle affair"
            android:textAllCaps="false"
            android:onClick="testHandleAffair"/>
    </LinearLayout>
    

    DBHelper

    package com.example.administrator.dbexcise.database;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    
    /**
     * Created by Administrator on 2019/6/19.
     */
    
    public class DBHelper extends SQLiteOpenHelper {
    
        public DBHelper(Context context, int version) {
            //上下文,数据库文件名,null,版本号
            super(context, "person.db", null, version);
        }
    
        /**
         * 什么时候调用?
         *      当数据库文件创建时调用
         * 在此方法中做什么?
         *      建表,初始化数据
         * @param sqLiteDatabase 是操作数据库的对象
         */
        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {
            Log.e("TAG", "onCreate: " );
    
            String sql = "create table person (_id integer primary key autoincrement,name varchar,age int)";
            sqLiteDatabase.execSQL(sql);
        }
    
        /**
         * 当传入的版本号大于当前数据库的版本号时调用
         * 用于更新数据库
         * @param sqLiteDatabase
         * @param i
         * @param i1
         */
        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
            Log.d("TAG", "onUpgrade: ");
        }
    }
    

    MainActivity

    package com.example.administrator.dbexcise;
    
    import android.content.ContentValues;
    import android.content.Intent;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    import com.example.administrator.dbexcise.database.DBHelper;
    
    public class MainActivity extends AppCompatActivity {
    
        Button button, button2, button3, button4, button5, button6;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            button = (Button) findViewById(R.id.bt1);
            button2 = (Button) findViewById(R.id.bt2);
            button3 = (Button) findViewById(R.id.bt3);
            button4 = (Button) findViewById(R.id.bt4);
            button5 = (Button) findViewById(R.id.bt5);
            button6 = (Button) findViewById(R.id.bt6);
        }
    
        /**
         * 创建库
         *
         * @param view
         */
        public void testCreateDB(View view) {
            DBHelper dbHelper = new DBHelper(this, 1);
            //获取连接
            SQLiteDatabase sqLiteDatabase = dbHelper.getReadableDatabase();
    
            Toast.makeText(this, "创建数据库", Toast.LENGTH_SHORT).show();
        }
    
        /**
         * 插入数据
         *
         * @param view
         */
        public void testInsertDate(View view) {
            DBHelper dbHelper = new DBHelper(this,2);
            //1.得到连接
            SQLiteDatabase sqLiteDatabase = dbHelper.getReadableDatabase();
    
            //2.执行insert
            ContentValues values = new ContentValues();
            values.put("name","Tom");
            values.put("age",21);
            //返回插入的id
            /**
             * 第一个参数:表名
             * 第二个参数:null
             * 第三个参数:传入的HashMap值
             */
            long id = sqLiteDatabase.insert("person",null,values);
    
            //3.关闭连接
            sqLiteDatabase.close();
    
            //4.提示
            Toast.makeText(this,"id= "+id,Toast.LENGTH_SHORT).show();
        }
    
        /**
         * 删除数据
         *
         * @param view
         */
        public void testDeleteDate(View view) {
            DBHelper dbHelper = new DBHelper(this,2);
            //1.得到连接
            SQLiteDatabase sqLiteDatabase = dbHelper.getReadableDatabase();
    
            //2.执行delete
            String where = "name = ?";
            String[] value = new String[]{ "Tom" };
            //返回删除的数量
            /**
             * 第一个参数:表名
             * 第二个参数:删除的where后的语句
             * 第三个参数:? 所代表的值
             */
            int deleteCount = sqLiteDatabase.delete("person",where,value);
    
            //3.关闭连接
            sqLiteDatabase.close();
    
            //4.提示
            Toast.makeText(this,"deleteCount = "+deleteCount,Toast.LENGTH_SHORT).show();
        }
    
        /**
         * 更新数据
         *
         * @param view
         */
        public void testUpdateDate(View view) {
            DBHelper dbHelper = new DBHelper(this,2);
            //1.得到连接
            SQLiteDatabase sqLiteDatabase = dbHelper.getReadableDatabase();
    
            //2.执行update  update person set name = "Jack",age = 20 where _id = 6
    
            /**
             * 第一个参数:表名
             * 第二个参数:更新的value
             * 第三个参数:where 后的语句
             * 第四个参数:? 所代表的值
             */
            ContentValues values = new ContentValues();
            values.put("name","Jack");
            values.put("age",20);
            int updateCount = sqLiteDatabase.update("person",values,"_id = 6",null);
    
            //3.关闭连接
            sqLiteDatabase.close();
    
            //4.提示
            Toast.makeText(this,"updateCount = "+updateCount,Toast.LENGTH_SHORT).show();
        }
    
        /**
         * 查询数据
         *
         * @param view
         */
        public void testQueryDate(View view) {
            DBHelper dbHelper = new DBHelper(this,2);
            //1.得到连接
            SQLiteDatabase sqLiteDatabase = dbHelper.getReadableDatabase();
    
            //2.执行query select * from person
            Cursor cursor =  sqLiteDatabase.query("person",null,null,null,null,null,null);
            //得到cursor查询到的总记录数
            int count = cursor.getCount();
    
            while(cursor.moveToNext()){
                // id
                int id = cursor.getInt(0);
    
                // name
                String name = cursor.getString(1);
    
                // age
                int age = cursor.getInt(cursor.getColumnIndex("age"));
            }
    
            //3.关闭连接
            cursor.close();
            sqLiteDatabase.close();
    
            //4.提示
            Toast.makeText(this,"count = "+count,Toast.LENGTH_SHORT).show();
        }
    
        /**
         * 事务处理
         *
         * 一个功能中对数据库进行多个操作,要就都成功要就都失败
         * 事务处理三步骤:
         * 1.   开启事务(获取连接后)
         * 2.   设置事务成功(在全部正常执行完后)
         * 3.   结束事务(finally中进行)
         *
         * @param view
         */
        public void testHandleAffair(View view) {
            SQLiteDatabase sqLiteDatabase = null;
            try {
                DBHelper dbHelper = new DBHelper(this,2);
                //1.得到连接
                sqLiteDatabase = dbHelper.getReadableDatabase();
    
                //1. 开启事务(获取连接后)
                sqLiteDatabase.beginTransaction();
    
                //2.执行update  update person set age = 20 where _id = 6
                ContentValues values = new ContentValues();
                values.put("age",20);
                int updateCount = sqLiteDatabase.update("person",values,"_id = 6",null);
    
                boolean flag = true;
                if(flag) {
                    throw new RuntimeException("出异常啦!!");
                }
    
                //执行update  update person set age = 21 where _id = 7
                values.put("age",21);
                int updateCount2 = sqLiteDatabase.update("person",values,"_id = 7",null);
    
                //2.设置事务成功(在全部正常执行完后)
                sqLiteDatabase.setTransactionSuccessful();
            }catch (Exception e) {
                Toast.makeText(this,"出异常啦!!!",Toast.LENGTH_SHORT).show();
            }finally {
                if (sqLiteDatabase!=null) {
                    //3.结束事务(finally中进行)
                    sqLiteDatabase.endTransaction();
                    //3.关闭连接
                    sqLiteDatabase.close();
                }
            }
        }
    }
    

    注意:new一个数据库对象后,一定要获取连接再进行操作。

     

    链接:https://pan.baidu.com/s/1TwNX_V0pI-yPSBFqJpm9DA 


    提取码:hnz2

    展开全文
  • Android学习笔记----SQLiteDatabase 自带添加、删除、更新查询的操作方法:实现添加,删除,更新, 7.除了前面给大家介绍的execSQL()和rawQuery()方法, SQLiteDatabase还专门提供了对应 于添加、删除、更新、...
  • Android更新带进度条的通知栏

    万次阅读 多人点赞 2015-08-06 15:47:05
    在网上查询了下,Android版本更新通知栏进度条,醉了,基本都是复制过来,有的代码不全,连源码下载都没有,有下载也需要积分,还不能用,真黑心啊!!之前自己也写过自定义通知栏Notification,想了还是自己写吧...
  • 使用VBA动态创建SQL查询语句

    千次阅读 2018-02-28 07:19:00
    在VBA使用ADO可以高效的查询数据,但是写SQL查询语句是个有些令人头痛的事情,其实在ADO中用到的SQL语句的语法并不是很复杂,很多时候是由于即要思考SQL的语法,又要用VBA的字符串连接命令,最终搞得一团糟。...
  • Mysql系统参数查询和设置

    千次阅读 2018-10-16 11:46:04
    信息包括表类型和表的最新更新时间。 show privileges; -- 显示服务器所支持的不同权限。 show create database database_name; -- 显示create database 语句是否能够创建指定的数据库。 show create table table...
  • 查询字段是否存在 查询course表中,存在lectures_count字段的记录信息 ...参数:ture或者false 使用update命令,删除单一字段 update命令 update命令格式: db.collection.update(criteri...
  • 有输入参数的存储过程

    千次阅读 2015-08-08 23:12:57
    创建带有输入参数的存储过程: drop procedure if exists proc_user_in; delimiter // create procedure proc_user_in(in a int) begin select * from user where userid > a; end// delimiter ;以上代码即在当前...
  • Mybatis 中传入数组类型参数批量更新表数据的写法 假设有个文章表,表字段有:文章ID,状态,作者ID,标题,创建时间。 文章表在 Mybatis 的 xml 文件里的定义: <resultMap id="BaseResultMap" type=...
  • MySQL入门之创建更新、修改、复制、查看表
  • 创建自动、增量更新的物化视图

    千次阅读 2014-10-19 19:41:02
    创建定期增量刷新物化视图  2012-01-16 10:34:57| 分类: ORACLE工程实施|举报|字号 订阅 1,在源库建立被同步表的物化视图日志: create materialized view log on db_sbzs.t_sb_yzpz ...
  • 映射文件中查询语句部分: &amp;lt;!--通过map进行条件查询--&amp;gt; &amp;lt;select id=&quot;selectByMap&quot; resultType=&quot;com.heiketu.testpackage.pojo.Product&quot;&...
  • [文章摘要]介绍了oracle...查询(select)数据 更新(update)数据 添加超过4k字节的xml文档到xmltype型字段 适合初学者。  关键词: oracle9i xmltype oracle从9i开始支持一种新的数据类型---- xmltype,用于存
  • 带参数的存储过程在Java中的应用: /** create procedure ShipVia_Sum @via int, @sum money output as select @sum = sum(freight) from orders where shipVia = @via **/   ...
  • 作者:Tom Dykstra 和 Rick AndersonContoso 大学示例 web 应用程序演示如何使用 Entity Framework Core 和 Visual Studio 创建 ASP.NET Core MVC web 应用程序。 若要了解教程系列,请参阅本系列中的第一个教程...
  • 用户数据列表 - 请求路径:users - 请求方法:get - 请求参数 | 参数名 | 参数说明 | 备注 | | -------- | ------------ | -------- | | query | 查询参数 | 可以为空 | | pagenum | 当前页码 | 不能为空 | | ...
  • 今天接到一用户问题,ArcSDE for SQL Server 数据库,利用ArcGIS桌面创建数据集时,提示如下错误: 其实这个错误已经非常明显的告诉了用户,...那么数据库哪个参数与“查询开销”有关呢? MSSQLSERVER_8649
  • 首先我们要下载JDBC的jar包,本项目中jar放在了lib...然后添加一个Main,使用JDBC链接MySQL数据库,创建表结构并添加数据和查询数据具体代码:public class Main{ public static void main(String[] args) throws Exc
  • Neo4j 第四篇:使用C#更新查询Neo4j

    千次阅读 2017-11-07 10:49:04
    本文使用的IDE是Visual Studio 2015 ,驱动程序是Neo4j官方的最新版本:Neo4j Driver 1.3.0 ,创建的类库工程(Project...但是,官方驱动程序仅支持标量类型的参数(Parameters),由于Neo4j的批量更新,例如,Cypher
  • 视图查询效率和更新效率

    万次阅读 2011-10-25 10:48:46
    这比较容易带来性能问题,跟简单视图不同的是,在复杂视图查询的背后,数据库会自动地物化一个视图,即创建一个包含视图数据的临时表,基于这个临时表再执行查询,并在查询完成后删除临时表。 结果: 如果...
  • 创建视图在单表上创建视图在多表上创建视图
  • 原因是:jpa和hibernate在进行参数替换的时候是使用占位符的形式,防止了sql的注入,在解析会给参数带上单引号,但是可以通过定义原生的sql进行解决动态sql查询,但无法实现动态sql更新,如果需要更新必须获取到表...
  • 数据库使用开启 mongodb 服务:要管理数据库,必须先...清屏:cls查看所有数据库列表show dbs 创建数据库使用数据库、创建数据库use student 如果真的想把这个数据库创建成功,那么必须插入一个数据。 数据库中不能直
  • ASP.NET调用SQL后台存储过程时,有时突然就变得很慢,在后台直接执行存储过程没问题,但在前台调用存储过程时就是很慢,而且在前台调用成功后,再次调用还是一样的慢,但更新一下存储过程再调用就很快了。...
  • 前言 因为做一个比赛的项目 ,需要用到 neo4j 数据库,所以要学习其语言cql,特来整理一下他的基本语言。 整片的语句是按照 了 Neo4j 数据库自带的示例 Movie Graph 来写的。 直接看这个博客也是没有问题的。...参数
  • 今天学习了android 中内嵌的数据库sqlite,sqlite的简单介绍: SQLite简介 Google为Andriod的较大的数据处理提供了...使用 SQLite 只需要一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 422,347
精华内容 168,938
关键字:

创建带参数的更新查询