• 关于

    获取文本框内容

    的搜索结果

回答

首先你要设定好文本框宽度,然后手动输入字符(最好用数字)来确定文本框有中能输入多少个数字。一个数字、一个英文字母 = 1个字节,一个汉字 = 2个字节有了以上信息:我们就可以用js或jquery去获取文本框中的文本,计算文本框中有多少个字节。假设:文本框宽 = 30像素 实际可以写入10个数字也就是10个字节,多于10就超出文本框的款度。再假设文本框中输入:123abc字节数用js通进正则我们找出汉字个数 乘以 2 就是汉字所占的字节,加上非汉字的字符(全角符号也是2个字节),上例中一个有12个字节。我们知道现文本框中 >10字符就超出了文本框宽度。JS判断内容参考:http://edu.51cto.com/course/course_id-4590.html
a123456678 2019-12-02 03:09:47 0 浏览量 回答数 0

问题

2.2.2.1浏览器

浏览器 [size=; font-size: inherit,inherit]打开网页[size=; font-size: inherit,inherit] 用于操作内部浏览器打开一个新的网页,或...
福利达人 2019-12-01 21:58:36 2466 浏览量 回答数 0

问题

富文本编辑器实时保存如何实现?

我现在遇到的问题是:1.如何判断富文本编辑器内的内容有变化2.如果文本框内容有变化,每隔五秒保存一次。我的解决方法:1.通过比较text.length,但是不能保证字符不一样。2.通过比较字符串,但是如果文本太多,非常影响性能。这两种判断都...
杨冬芳 2019-12-01 19:55:06 1246 浏览量 回答数 1

阿里云爆款特惠专场,精选爆款产品低至0.55折!

1核2G ECS n4 89.64元/年,精选爆款产品低至0.55折!

问题

MFC 中 CString转换成char[]数组

环境为vs2010CString szText;char a[1024];edit1.GetWindowText(szText);//获取edit1编辑框的文本怎么将CString类 szText 转换为char[]数组的内容?memcpy...
a123456678 2019-12-01 20:06:56 1821 浏览量 回答数 1

问题

请问手机端的输入法是怎么把输入的文本传入网页输入框的?

我们平时做移动开发,不管是ios还是android,原生和webview里面网页的交互都是要经过一些特殊的处理才能让他们进行交互,但是网页的输入框却能直接获取输入法输入的内容,有人知道原理吗?...
爵霸 2019-12-01 20:08:51 989 浏览量 回答数 1

回答

JavaScript,form表单做一个onsubmit的事件监听,然后获取输入框中的内容,用ajax POST到后端,后端插入数据库成功后HTTP response header返回201 Created,前端JavaScript把刚POST的文本内容生成一个HTML element插入到原来的DOM tree里
小旋风柴进 2019-12-02 02:17:56 0 浏览量 回答数 0

问题

Kindeditor创建后如何隐藏文本框,尝试了很久,求帮帮忙报错 

kindeditor创建编辑框是通过创建一个包含iframe的新div并隐藏原textarea来实现的,然而该div只继承原编辑框的宽高,并没有继承id,官方文档中提供的node中的方法和kinde...
kun坤 2020-06-03 13:09:23 9 浏览量 回答数 1

问题

java swing JTextField 设置为空时获取的内容是?

jtf3 = new JTextField(3); String date = this.jtf3.getText().trim();当文本框中我没有输入任何东西,date获得的值是什么?...
蛮大人123 2019-12-01 19:56:54 1692 浏览量 回答数 1

问题

2.1.4.2浏览器相关功能函数

2.浏览器相关函数 2.1 J_IE_Create (链接地址,[尝试抓取:否],[是否等待:是],[浏览器类型]) 作用:创建一个IE窗口,返回一个窗口的对象 返回值:返回浏览器对象ÿ...
福利达人 2019-12-01 21:58:33 2173 浏览量 回答数 0

问题

java企业官网源码 自适应响应式 freemarker 静态引擎 SSM 框架

网站信息:维护网站基本信息,比如标题、描述、关键词、联系方式、地址等 业务说明:网站首页文字业务介绍 公司理念:网站首页展示公司的4个理念 轮播图片:网站首页上面4...
游客ydre72cd7ywew 2019-12-01 19:52:49 32 浏览量 回答数 0

问题

php写的论坛,要怎么保留用户发帖文本的原有样式同时又能防注入呢?

要防注入就不得不对用户输入的文本进行过滤,比如去掉一些标签什么的再存进数据库,但是这样一来再显示用户发帖内容的时候,原有的格式就被破坏了,麻烦各位老手指点应该怎么做。我用的thinkphp框架,还有kindeditor的插件,用I方法获取数...
小旋风柴进 2019-12-01 20:12:19 1049 浏览量 回答数 1

问题

xpath, 如何获取herf的文本内容

我打算用Scrapy框架爬取一个网站的数据在JS控制台上,我用$x('//div[@class="summary"]//div[contains(@class, "tags")]')这个命令获取了我想要的数据,但是我得对我的数据进行过滤。下...
杨冬芳 2019-12-01 19:55:27 1409 浏览量 回答数 1

回答

1.UITextField的初始化和设置 textField = [[UITextField alloc] initWithFrame:CGRectMake(120.0f, 80.0f, 150.0f, 30.0f)]; [textField setBorderStyle:UITextBorderStyleRoundedRect]; //外框类型 textField.placeholder = @"password"; //默认显示的字 textField.secureTextEntry = YES; //密码 textField.autocorrectionType = UITextAutocorrectionTypeNo; textField.autocapitalizationType = UITextAutocapitalizationTypeNone; textField.returnKeyType = UIReturnKeyDone; textField.clearButtonMode = UITextFieldViewModeWhileEditing; //编辑时会出现个修改X textField.delegate = self; 2.要实现的Delegate方法,关闭键盘 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [self.textField resignFirstResponder]; return YES; } 3. 可以在UITextField使用下面方法,按return键返回 -(IBAction) textFieldDone:(id) sender { [textFieldName resignFirstResponder]; } 链接TextField控件的"Did end on exit" 最右侧加图片是以下代码, UIImageView *imgv=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"right.png"]]; text.rightView=imgv; text.rightViewMode = UITextFieldViewModeAlways; 如果是在最左侧加图片就换成: text.leftView=imgv; text.leftViewMode = UITextFieldViewModeAlways; UITextField 继承自 UIControl,此类中有一个属性contentVerticalAlignment 所以想让UITextField里面的text垂直居中可以这样写: text.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 查看函数的方法: 按住command键双击进入函数声明 按住alt键双击进入doc文档 /////////////////////////////////////////////////////////////// 文本框常用方法: 如何用程序删除文本框中选中的文本 [textView delete: nil]; /////////////////////////////////////////////////////////////// 如何限制文本框只能输入数字: 建立NSNumberFormatter的子类,增加这个方法,将formatter链接至文本框。 - (BOOL) isPartialStringValid: (NSString **) partialStringPtr proposedSelectedRange: (NSRangePointer) proposedSelRangePtr originalString: (NSString *) origString originalSelectedRange: (NSRange) origSelRange errorDescription: (NSString **) error { NSCharacterSet *nonDigits; NSRange newStuff; NSString *newStuffString; nonDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; newStuff = NSMakeRange(origSelRange.location, proposedSelRangePtr->location - origSelRange.location); newStuffString = [*partialStringPtr substringWithRange: newStuff]; if ([newStuffString rangeOfCharacterFromSet: nonDigits options: NSLiteralSearch].location != NSNotFound) { *error = @"不是数字"; return (NO); } else { *error = nil; return (YES); } } /////////////////////////////////////////////////////////////// 从文本框获取十六进制数据的代码 char singleNumberString[3] = {'\0','\0','\0'}; uint32_t singleNumber = 0; uint32_t i = 0; NSMutableData *data = [NSMutableData data]; //从文本框获取到得数据 const char *buf = [[_hexToSendTextField text] UTF8String]; //转换为十六进制 for(i = 0; i < strlen(buf); i+=2) { if(((i+1) < len && isxdigit(buf) && (isxdigit(buf[i+1]))) { singleNumberString[0] = buf; singleNumberString[1] = buf[i+1]; sscanf(singleNumberString, "%x", &singleNumber); [data appendBytes:(void*)(&tmp) length:1]; } else { break; } } //输出 NSLog(@"%@", data); ///////////////////////////////////////////////////////////// 点击 UITextView 输入文字,光标都从最初点开始 - (void)textViewDidChangeSelection:(UITextView *)textView { NSRange range; range.location = 0; range.length = 0; textView.selectedRange = range; } /////////////////////////////////////////////////////////// 软键盘 在登录页面要实现用户名和密码,密码要是点点格式,引入当前页面光标要停留在用户名选项,软键盘要弹出界面。如下图: 弹出键盘: [username becomeFirstResponder]; 取消键盘: [username resignFirstResponder]; 密码保护: password.secureTextEntry=YES; ////////////////////////////////////////////////////////////////// 1.UITextField的初始化和设置 textField = [[UITextField alloc] initWithFrame:CGRectMake(120.0f, 80.0f, 150.0f, 30.0f)]; [textField setBorderStyle:UITextBorderStyleRoundedRect]; //外框类型 textField.placeholder = @"password"; //默认显示的字 textField.secureTextEntry = YES; //密码 textField.autocorrectionType = UITextAutocorrectionTypeNo; textField.autocapitalizationType = UITextAutocapitalizationTypeNone; textField.returnKeyType = UIReturnKeyDone; textField.clearButtonMode = UITextFieldViewModeWhileEditing; //编辑时会出现个修改X textField.delegate = self; 2.要实现的Delegate方法,关闭键盘 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [self.textField resignFirstResponder]; return YES; } 3. 可以在UITextField使用下面方法,按return键返回 -(IBAction) textFieldDone:(id) sender { [textFieldName resignFirstResponder]; } 链接TextField控件的"Did end on exit" //////////////////////////////////////////////////////////////////// 限制输入文本的长度 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (range.location >= MAX_LENGTH) return NO; // return NO to not change text return YES; } if (textField.text.length >= 10 && range.length == 0) return NO; return YES; - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if ([textField.text length] > MAXLENGTH) { textField.text = [textField.text substringToIndex:MAXLENGTH-1]; return NO; } return YES; } ////////////////////////////////////////////////////////////////////// 使用UITextFieldDelegate来隐藏键盘 在iPhone界面上,时常会需要当用户输入完内容后,隐藏键盘。 当然有很多方法,今天只介绍使用UITextFieldDelegate这个协议实现隐藏键盘。 其实很简单, 需要三步: 1. 在你的控制器类中,加入UITextFieldDelegate这个协议 如:@interface AddItemViewController : UIViewController <UITextFieldDelegate> 2. 在使用了UITextFieldDelegate协议的控制器类的实现中,加入- (BOOL)textFieldShouldReturn:方法。 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } //设置焦点: [UITextField becomeFirstResponder]; 3. 将xib文件中的TextField控件的delegate变量指向到之前使用UITextFieldDelegate协议的那个控制器类,将 TextField的delegate IBOutlet变量右键链接到前面的控制器类的实例上。或者使用代码方式,指定相关TextField的delegate变量。 - (void)viewDidLoad { [super viewDidLoad]; itemNameField.delegate = self; priceField.delegate = self; } 答案来源网络,供参考,希望对您有帮助
问问小秘 2019-12-02 02:20:54 0 浏览量 回答数 0

问题

CodePipeline用户指南:证书配置

用户证书是 CodePipeline 自动化获取您的代码文件/容器服务/或通道打通所需的凭证,CodePipeline 会为每个用户的凭证文件进行加密存储。 在侧导航中选择 用户证书 进入证书列表页面。单击 添加证书。 ...
行者武松 2019-12-01 21:55:37 1337 浏览量 回答数 0

回答

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class Calculation extends JFrame implements ActionListener{ private JTextField txfResult;//显示操作结果的文本框 JTextField txfM;//显示记忆的索引值的文本框 Double dM=0d;//存储数据 public Calculation() { super("swing 计算器实例"); /*设置用于显示的文本框*/ txfResult =new JTextField("0",30);//初始文本显示0 最大列数30 txfResult.setBackground(Color.WHITE); txfResult.setHorizontalAlignment(JTextField.RIGHT);//数字在文本框中靠右显示 txfResult.setEditable(false);//文本框不可编辑 即为readOnly只读属性 JPanel ResultTextPanel=new JPanel();//放操作结果文本框的面板 ResultTextPanel.add(txfResult); /*设置用于控制数字的键与显示记忆索引值的文本框*/ txfM=new JTextField(2);//最长2列 JButton b1=new JButton("Backspace");//退格键 JButton b2=new JButton("CE");//重置键 JButton b3=new JButton("C");//清0键 JPanel ControlPanel=new JPanel(); ControlPanel.setLayout(new GridLayout(1, 4, 2, 2));//1行4列 水平间距2 垂直间距2 ControlPanel.add(txfM); ControlPanel.add(b1); ControlPanel.add(b2); ControlPanel.add(b3); b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); /*数字和运算符键*/ String dcKey[]= {"MC","7","8","9","/","sqrt","MR","4","5","6","*","%","MS","1","2","3","-","1/x" ,"M+","0","+/-",".","+","="}; JPanel dcKeyPanel =new JPanel();//数字和运算符的面板 dcKeyPanel.setLayout(new GridLayout(4, 6,2,2)); //一个 循环放好所有数字和运算符组件 for(int i=0;i<24;i++) { JButton b=new JButton(dcKey[i]); dcKeyPanel.add(b); b.addActionListener(this); } Container ct=this.getContentPane();//窗体内容面板对象 ct.setLayout(new BorderLayout()); ct.add(ResultTextPanel,BorderLayout.NORTH); ct.add(ControlPanel,BorderLayout.CENTER); ct.add(dcKeyPanel,BorderLayout.SOUTH); pack(); setVisible(true); setResizable(false);//禁止最大化 setLocationRelativeTo(null);//居中显示 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new Calculation(); } //////////////////////////////////////////////////////数字键和功能键的实现///////////////////////////////////////////////////////// private boolean newDigital=true;//类内全局boolean变量 用于表示是否是输入数的标志 private String operation="";//表示运算符的字符串 private double d1;//二元运算前操数 private double d2;//二元运算后操作数 private int optionValue;//区别加减乘除运算符的变量 /*监听方法*/ @Override public void actionPerformed(ActionEvent e) { String s=(e.getActionCommand());//返回与此动作相关的命令字符串 就是button上显示的字 String str=txfResult.getText(); /*后退键*/ if(s.equals("Backspace")) { if(str.equals("0")||str.equals("")) {//已经是清0状态下 不可再清0了 return; } String s1=txfResult.getText(); txfResult.setText(s1.substring(0, s1.length()-1));//截掉最后一个数字 } /*重置键*/ if(s.equals("CE")) { txfResult.setText("0"); newDigital=true;//是否是新输入的数的标志设置为true } /*清0键*/ if(s.equals("C")) { txfResult.setText("0"); optionValue=0;//表示运算符的变量设置为0 newDigital=true;//表示是否新输入的数的标志设置为true } /*数字键*/ if(s.length()==1&&s.charAt(0)>='0'&&s.charAt(0)<='9') { if(!newDigital) { txfResult.setText(str+s);//不是新输入的数 }else { txfResult.setText(s); newDigital=false;//表示是否新输入的数的标志设置为false } return; } /*小数点*/ if(s.equals(".")) { if(txfResult.getText().indexOf(".")==-1) {//若之前尚不存在小数点 /*判断数字是否0打头*/ if(txfResult.getText().trim().startsWith("0")) {//强大的API txfResult.setText("0."); newDigital=false; }else { txfResult.setText(str+".");//str事件刚开始就得到的txfResult.getText() } } return; } /* 表示数字正负符号+/- */ if(s.equals("+/-")) { double d=Double.parseDouble(str.trim());//获取输入的数字 txfResult.setText(String.valueOf(-d));//取得获取输入数字的相反数 return; } //////////////////////////////////////////////////////加减乘除运算的实现///////////////////////////////////////////////////////// if(s.equals("+")) { d1=Double.parseDouble(txfResult.getText());//立刻获取前操作数的值 txfResult.setText(""); optionValue=1;//设置运算符标志 } if(s.equals("-")) { d1=Double.parseDouble(txfResult.getText()); optionValue=2; } if(s.equals("*")) { d1=Double.parseDouble(txfResult.getText()); optionValue=3; } if(s.equals("/")) { d1=Double.parseDouble(txfResult.getText()); optionValue=4; } if(s.equals("=")) { d2=Double.parseDouble(txfResult.getText());//获取后操作数的值 /*根据运算符标志的不同值确定计算结果*/ switch(optionValue) { case 1: txfResult.setText(String.valueOf(d1+d2)); break; case 2: txfResult.setText(String.valueOf(d1-d2)); break; case 3: txfResult.setText(String.valueOf(d1*d2)); break; case 4: if(d2!=0) { txfResult.setText(String.valueOf(d1/d2)); }else { txfResult.setText("除数不能为0"); return; } break; } operation="";//运算结束 清空运算符 } ////////////////////////////////求平方根 倒数 百分比运算///////////////////////////////// if(s.equals("sqrt")) { double d=Double.parseDouble(txfResult.getText().trim());//获取操作数的值 if(d>0) { txfResult.setText(String.valueOf(Math.sqrt(d)));//计算该值的平方根 }else { txfResult.setText("负数不能计算平方根"); } }else if(s.equals("1/x")) { double d=Double.parseDouble(txfResult.getText().trim());//计算倒数 if(str.equals("0")) { txfResult.setText("除数不能为0"); }else { txfResult.setText(String.valueOf(1/d)); } }else if(s.equals("%")) { txfResult.setText((String.valueOf(Double.parseDouble(str)/100))); } ///////////////////////////////////////////实现数据的记忆功能/////////////////////////////////// if(s.equals("MC")) {//清空存储数据 txfResult.setText(""); dM=0d; newDigital=true; } if(s.equals("MR")) { if(txfM.getText().trim()!="") { txfResult.setText(""+dM);//显示存储数字当前值 } } if(s.equals("MS")) { dM=Double.parseDouble(txfResult.getText().trim()); txfM.setText("M");//存储区显示M } if(s.equals("M+")) { dM=dM+Double.parseDouble(txfResult.getText().trim());//将显示的数字与已经存储的数据相加 即更新存储数据 } } }
DM。 2020-05-27 13:40:29 0 浏览量 回答数 0

问题

在 JFrame类里面添加方法报错

public class DynamicArray extends JFrame { private JPanel contentPane; private JTextField textField; /** * Launch the a...
蛮大人123 2019-12-01 20:20:23 1218 浏览量 回答数 1

问题

2.1.4.3文件相关函数

3.文件相关函数 3.1 J_File_MaxCount(文件路径) 作用:获取文件里面一共有多少行 返回值:获取文件里面一共有多少行 例子: Func Example31()     ;声明一个名为$fi...
福利达人 2019-12-01 21:58:34 2192 浏览量 回答数 0

回答

PHP 中的 include、require 函数可以实现 include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。 包含文件很有用,如果您需要在网站的多张页面上引用相同的 PHP、HTML 或文本的话。 PHP include 和 require 语句 通过 include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)。 include 和 require 语句是相同的,除了错误处理方面: require 会生成致命错误(E_COMPILE_ERROR)并停止脚本 include 只生成警告(E_WARNING),并且脚本会继续 因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。 包含文件省去了大量的工作。这意味着您可以为所有页面创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。 例如: <html> <body> <h1>欢迎访问我们的首页!</h1> <?php require 'header.php';?> <p>一段文本。</p> <p>一段文本。</p> <?php include 'footer.php';?> </body> </html> 答案来源于网络
养狐狸的猫 2019-12-02 02:15:16 0 浏览量 回答数 0

问题

java企业官网源码 自适应响应式 freemarker 静态引擎 SSM 框架

代码介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问速度快,轻便...
游客ydre72cd7ywew 2019-12-01 19:55:56 23 浏览量 回答数 0

问题

java官网源码 门户网站 自适应响应式 freemarker 静态引擎 SSM 框架

代码介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问速度快,轻便...
游客ydre72cd7ywew 2019-12-01 20:01:28 9 浏览量 回答数 0

回答

看到小红通过了它的好友申请,小蓝赶紧发起聊天:小红美眉,你平时喜欢做什么 呀,有空我们可以一起约呀。此处就可以使用 input 输入框啦,不仅可以输入文 字还可以输入数字、密码哦。 输入框,可设置输入内容的类型、长度、显示形式等。当用户需要输入文字内容时 点击文本框,它将自动打开键盘。使用文本字段来请求少量信息。 注意:  iOS 系统支付宝客户端版本 10.1.80 及以上不支持 focus=true 自动唤起。  小程序中 input 如果父类是 position: fixed,可以加上 enableNative="{{false}}",解决 输入框错位问题。 示例代码 <view class="page"> <view class="page-description">输入框</view> <view class="page-section"> <view class="form-row"> <view class="form-row-label">受控聚焦</view> <view class="form-row-content"> <input class="input" focus="{{focus}}" onFocus="onFocus" onBlur="onBlur" placeholder="input something" /> </view> </view> <view class="page-section-btns"> <button size="mini" onTap="bindButtonTap">聚焦</button> </view> </view> <view class="page-section"> <view class="form-row"> <view class="form-row-label"><label for="controlled">显示输入 </label></view> <view class="form-row-content"> <input class="input" id="controlled" onInput="bindKeyInput" placeholder="show input content" /> </view> </view> <view class="extra-info">你输入的是:{{inputValue}}</view> </view> <view class="page-section"> <view class="form-row"> <view class="form-row-label">最大长度</view> <view class="form-row-content"> <input class="input" maxlength="10" placeholder="maxlength 10" /> </view> </view> <view class="form-line" /> <view class="form-row"> <view class="form-row-label">收起键盘</view> <view class="form-row-content"> <input class="input" onInput="bindHideKeyboard" placeholder="输入 123 自动收起键盘" /> </view> </view> <view class="form-line" /> <view class="form-row"> <view class="form-row-label">输入密码</view> <view class="form-row-content"> <input class="input" password type="text" placeholder="密码输入框" /> </view> </view> <view class="form-line" /> <view class="form-row"> <view class="form-row-label">输入数字</view> <view class="form-row-content"> <input class="input" type="number" placeholder="数字输入框" /> </view> </view> <view class="form-line" /> <view class="form-row"> <view class="form-row-label">小数点键盘</view> <view class="form-row-content"> <input class="input" type="digit" placeholder="带小数点的数字键盘" /> </view> </view> <view class="form-line" /> <view class="form-row"> <view class="form-row-label">身份证键盘</view> <view class="form-row-content"> <input class="input" type="idcard" placeholder="身份证输入键盘" /> </view> </view> </view> <view class="page-section"> <view class="page-section-title">搜索框</view> <view class="page-section-demo"> <view class="search-outer"> <input class="search-input" placeholder="搜索" value="{{search}}" onConfirm="doneSearch" onInput="handleSearch" /> <text class="search-cancel" onTap="clearSearch">取消</text> </view> </view> </view> </view> data: { focus: false, inputValue: '', }, bindButtonTap() { // blur 事件和这个冲突 setTimeout(() => { this.onFocus(); }, 100); }, onFocus() { this.setData({ focus: true, }); }, onBlur() { this.setData({ focus: false, }); }, bindKeyInput(e) { this.setData({ inputValue: e.detail.value, }); }, bindHideKeyboard(e) { if (e.detail.value === '123') { // 收起键盘 my.hideKeyboard(); } }, handleSearch(e) { console.log('search', e.detail.value); this.setData({ search: e.detail.value, }); }, doneSearch() { console.log('doneSearch', this.data.search); my.hideKeyboard(); }, clearSearch() { console.log('clear search', this.data.search); this.setData({ search: '', }); }, }); .extra-info { border-top: 1px solid #ddd; margin-left: 30rpx; padding: 20rpx 0; overflow: auto; } .search-outer { box-sizing: border-box; display:flex; height:40px; overflow:hidden; padding: 8px; border-bottom: 1px solid #ddd; background-color: #efeff4; } .search-outer * { box-sizing: border-box; } .search-input { flex:1; text-align: left; display: block; color: #000; height: 24px; font-size: 15px; background-color: #fff; border-color: transparent; } .search-input:focus + .search-cancel { margin-right:0; opacity: 1; } .search-cancel { margin-right:-40px; display: inline-block; opacity: 0; padding-left: 8px; height: 24px; line-height: 24px; font-size: 16px; color: #108ee9; text-align: right; transition: margin-right .3s,opacity .3s; transition-delay: .1s; } 属性 属性 类型 默认 值 描述 最低版本 value String - 初始内容 - name String - 组件名字,用于表单提交获取 数据 type String text input 的类型,有效值: text、 number、 idcard、 digit(可以唤起带有小数点的数 字键盘)、numberpad、 digitpad、 idcardpad。 numberpad、 digitpad、 idcardpad 基 础库 1.13.0 客户端 96 10.1.50,可通 过 my.canIUse(i nput.type.nu mberpad)来 检测。 password Boolean false 是否是密码类型 - placeholder String - 占位符 - placeholderstyle String - 指定 placeholder 的样式, 可设置间距 1.6.0 placeholderclass String - 指定 placeholder 的样式类 1.6.0 disabled Boolean false 是否禁用 - maxlength Number 140 最大长度 - focus Boolean false 获取焦点 - confirm-type String done 设置键盘右下角按钮的文字, 有效值:done(显示“完 成”)、go(显示“前 往”)、next(显示“下一 个”)、search(显示“搜 索”)、send(显示“发 送”),平台不同显示的文字 略有差异。注意:只有在 type=text 时有效 1.7.0 confirm-hold Boolean false 点击键盘右下角按钮时是否保 持键盘不收起状态 1.7.0 cursor Number - 指定 focus 时的光标位置 - selectionstart Number -1 获取光标时,选中文本对应的 焦点光标起始位置,需要和 selection-end 配合使用 1.7.0 97 selectionend Number -1 获取光标时,选中文本对应的 焦点光标结束位置,需要和 selection-start 配合使用 1.7.0 randomNum ber Boolean false 当 type 为 number, digit, idcard 数字键盘是否随机排 列 1.9.0 controlled Boolean false 是否为受控组件。为 true 时,value 内容会完全受 setData 控制 1.8.0 onInput EventHa ndle 键盘输入时触发 input 事件, event.detail = {value: value} onConfirm EventHa ndle 点击键盘完成时触发, event.detail = {value: value} onFocus EventHa ndle 聚焦时触发,event.detail = {value: value} onBlur EventHa ndle 失去焦点时触发(仅支持真 机),event.detail = {value: value} 内容来源:https://developer.aliyun.com/article/756818?spm=a2c6h.12873581.0.dArticle756818.26162b70Su1GZy&groupCode=tech_library
KaFei 2020-04-27 15:15:50 0 浏览量 回答数 0

问题

ECS实例自定义数据是什么

实例自定义数据,是阿里云 ECS 为您提供的一种自定义实例启动行为及传入数据的功能,该功能兼容 Windows 实例及 Linux 实例,主要有两种用途: 作为实例自定义脚本ÿ...
boxti 2019-12-01 21:40:33 1421 浏览量 回答数 0

问题

如何编辑文档

前提条件 用户已获取权限并登录 DMS控制台。 操作步骤 选择任意一个MongoDB实例,并单击[backcolor=transparent]登录数据库按钮进行登录。登录实例以后,依次展开左侧...
云栖大讲堂 2019-12-01 21:29:44 1148 浏览量 回答数 0

回答

很简单的!~ 1.安装CuteFTP软件 软件下载地址: http://music.flasher123.com/hanlan/jhhb/cuteftp5.0.1.rar 这里提供的下载未测试,不知道是什么版本 软件下载以后,解压缩,然后直接运行cuteftp.exe文件一步步安装即可。 2.获取FTP服务器地址、用户名、密码 你只有获取了FTP服务器的访问授权,才能够正常访问FTP服务器。一般情况下,你可以通过以下几个渠道获取FTP服务器的访问授权: (1)注册免费服务器空间 (2)购买付费服务器空间 (3)获取共享FTP服务器帐号 你所获得的FTP服务器的访问授权包括以下3个内容: (1) FTP服务器地址(比如IP地址218.4.33.125或者域名地址cn.flasher123.com) (2)用户名 (3)密码 有了FTP服务器授权法宝,你就可以继续下面的步骤了。 3.设置FTP站点连接 运行CuteFTP,CuteFTP窗口设计得层次分明,功能一幕了然。我们只需通过鼠标简单的拖曳操作就可以完成上传和下载的工作了!不过,别着急,现在还不能完成具体的上传和下载任务,因为,从图1可以看出,现在你还没有连接到任何一个FTP服务器(服务器目录列表窗口还是空白的)。要想连接到一个被授权的FTP服务器,你必须将前面第2点说明的那些授权对象(FTP服务器、用户名、密码)在CuteFTP软件中进行设置。具体方法如下: (1)打开【站点管理器】对话框 选择【文件】|【站点管理器】命令(或者单击工具栏最左边的【站点管理器】按钮),打开【站点管理器】对话框,(2)新建连接站点 在【站点管理器】对话框中,单击【新建】按钮,建立一个新站点,你可以根据所建立站点的特点重新输入一个站点名称。 (3)输入服务器地址、用户名和密码 单击你新建的站点名称,在右边对应的文本框中输入授权的服务器地址、用户名和密码,你可以参考图2所示进行设置。除了服务器地址、用户名和密码这三项是根据你自己的授权进行设置以外,其他参数一般都和图2所示一致。 (4)取消防火墙设置 有些服务器有一些特别的要求,比如会进行一些高级参数的设置,比较常见的是要取消防火墙设置。单击【编辑】按钮,弹出【设置】对话框,在这个对话框中单击【高级】标签,然后将窗口中的【使用PASV模式】和【使用防火墙设置】两项前面的复选勾去掉,最后单击【确定】按钮, 至此,你的FTP服务器连接就基本设置好了,在图2所示的对话框中单击【连接】按钮,这样就可以连接到服务器上了。如果连接一切正常的话,图1所示的“服务器目录列表”窗口中就会将远端授权给你的服务器目录列表出来。 如果你要上传文件,只需用鼠标将“本地目录”窗口中的文件拖曳到“服务器目录列表”窗口中的相应目录即可,下载文件也是同样的方法。另外,你还可以根据授权情况,在“服务器目录列表”窗口中进行建立目录、删除文件、文件重新命名等操作。 答案来源网络,供参考,希望对您有帮助
问问小秘 2019-12-02 02:04:50 0 浏览量 回答数 0

回答

演示:https://github.com/1178128850/webviewloaddate : package com.killua.webview; import android.graphics.Bitmap; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.webkit.JavascriptInterface; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends AppCompatActivity { public WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = new WebView(this); settings(); mWebView.setWebViewClient(new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { Log.i("===", "onPageFinished: "); // 获取页面内容 view.loadUrl("javascript:window.java_obj.showSource(" + "document.getElementsByTagName('html')[0].innerHTML);"); // 获取解析<meta name="share-description" content="获取到的值"> view.loadUrl("javascript:window.java_obj.showDescription(" + "document.querySelector('meta[name=\"share-description\"]').getAttribute('content')" + ");"); super.onPageFinished(view, url); } @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { super.onReceivedError(view, request, error); } }); mWebView.loadUrl("http://list.iqiyi.com/www/2/-------------24-1-1-iqiyi--.html"); } public final class InJavaScriptLocalObj { @JavascriptInterface public void showSource(String html) { System.out.println("====>html=" + html); } @JavascriptInterface public void showDescription(String str) { System.out.println("====>html=" + str); } } private void settings(){ // 开启JavaScript支持 mWebView.getSettings().setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new InJavaScriptLocalObj(), "java_obj"); // 设置WebView是否支持使用屏幕控件或手势进行缩放,默认是true,支持缩放 mWebView.getSettings().setSupportZoom(true); // 设置WebView是否使用其内置的变焦机制,该机制集合屏幕缩放控件使用,默认是false,不使用内置变焦机制。 mWebView.getSettings().setBuiltInZoomControls(true); // 设置是否开启DOM存储API权限,默认false,未开启,设置为true,WebView能够使用DOM storage API mWebView.getSettings().setDomStorageEnabled(true); // 触摸焦点起作用.如果不设置,则在点击网页文本输入框时,不能弹出软键盘及不响应其他的一些事件。 mWebView.requestFocus(); // 设置此属性,可任意比例缩放,设置webview推荐使用的窗口 mWebView.getSettings().setUseWideViewPort(true); // 设置webview加载的页面的模式,缩放至屏幕的大小 mWebView.getSettings().setLoadWithOverviewMode(true); } }
游客2q7uranxketok 2021-02-20 14:43:11 0 浏览量 回答数 0

问题

搜索引擎抓取系统概述(含搜索引擎工作原理等)

       站长朋友们,今后定期都将在这里跟大家分享一些有关搜索引擎工作原理及网站运营相关的内容,并且欢迎大家来此与我讨论或分享一些自己的经验、心得等等。今天先简单介绍一下关于搜索引擎抓取系统中有关抓取系统基本...
kideny 2019-12-01 21:30:39 5387 浏览量 回答数 1

问题

【javascript学习全家桶】934道javascript热门问题,阿里百位技术专家答疑解惑

阿里极客公益活动:或许你挑灯夜战只为一道难题或许你百思不解只求一个答案或许你绞尽脑汁只因一种未知那么他们来了,阿里系技术专家来云栖问答为你解答技术难题了他们用户自己手中的技术来帮助用户成长本次活动特邀百位阿里技术专家对javascript常...
管理贝贝 2019-12-01 20:07:22 6202 浏览量 回答数 1

回答

Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面详细讲解这五种方式的特点 第一种: 使用SharedPreferences存储数据 适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口 令密码等 核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。通过DDMS的File Explorer面板,展开文件浏览树,很明显SharedPreferences数据总是存储在/data/data/<package name>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。 SharedPreferences本身是一 个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例,该方法中name表示要操作的xml文件名,第二个参数具体如下: Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写。 Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写。 Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读,写 Editor有如下主要重要方法: SharedPreferences.Editor clear():清空SharedPreferences里所有数据 SharedPreferences.Editor putXxx(String key , xxx value): 向SharedPreferences存入指定key对应的数据,其中xxx 可以是boolean,float,int等各种基本类型据 SharedPreferences.Editor remove(): 删除SharedPreferences中指定key对应的数据项 boolean commit(): 当Editor编辑完成后,使用该方法提交修改 实际案例:运行界面如下 这里只提供了两个按钮和一个输入文本框,布局简单,故在此不给出界面布局文件了,程序核心代码如下: 、class ViewOcl implements View.OnClickListener{ @Override public void onClick(View v) { switch(v.getId()){ case R.id.btnSet: //步骤1:获取输入值 String code = txtCode.getText().toString().trim(); //步骤2-1:创建一个SharedPreferences.Editor接口对象,lock表示要写入的XML文件名,MODE_WORLD_WRITEABLE写操作 SharedPreferences.Editor editor = getSharedPreferences("lock", MODE_WORLD_WRITEABLE).edit(); //步骤2-2:将获取过来的值放入文件 editor.putString("code", code); //步骤3:提交 editor.commit(); Toast.makeText(getApplicationContext(), "口令设置成功", Toast.LENGTH_LONG).show(); break; case R.id.btnGet: //步骤1:创建一个SharedPreferences接口对象 SharedPreferences read = getSharedPreferences("lock", MODE_WORLD_READABLE); //步骤2:获取文件中的值 String value = read.getString("code", ""); Toast.makeText(getApplicationContext(), "口令为:"+value, Toast.LENGTH_LONG).show(); break; } } } 、读写其他应用的SharedPreferences: 步骤如下 1、在创建SharedPreferences时,指定MODE_WORLD_READABLE模式,表明该SharedPreferences数据可以被其他程序读取 2、创建其他应用程序对应的Context: Context pvCount = createPackageContext("com.tony.app", Context.CONTEXT_IGNORE_SECURITY);这里的com.tony.app就是其他程序的包名 3、使用其他程序的Context获取对应的SharedPreferences SharedPreferences read = pvCount.getSharedPreferences("lock", Context.MODE_WORLD_READABLE); 4、如果是写入数据,使用Editor接口即可,所有其他操作均和前面一致。 SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。 第二种: 文件存储数据 核心原理: Context提供了两个方法来打开数据文件里的文件IO流 FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),这两个方法第一个参数 用于指定文件名,第二个参数指定打开文件的模式。具体有以下值可选: MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可 以使用Context.MODE_APPEND MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 MODE_WORLD_READABLE:表示当前文件可以被其他应用读取; MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。 除此之外,Context还提供了如下几个重要的方法: getDir(String name , int mode):在应用程序的数据文件夹下获取或者创建name对应的子目录 File getFilesDir():获取该应用程序的数据文件夹得绝对路径 String[] fileList():返回该应用数据文件夹的全部文件 public String read() { try { FileInputStream inStream = this.openFileInput("message.txt"); byte[] buffer = new byte[1024]; int hasRead = 0; StringBuilder sb = new StringBuilder(); while ((hasRead = inStream.read(buffer)) != -1) { sb.append(new String(buffer, 0, hasRead)); } inStream.close(); return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } public void write(String msg){ // 步骤1:获取输入值 if(msg == null) return; try { // 步骤2:创建一个FileOutputStream对象,MODE_APPEND追加模式 FileOutputStream fos = openFileOutput("message.txt", MODE_APPEND); // 步骤3:将获取过来的值放入文件 fos.write(msg.getBytes()); // 步骤4:关闭数据流 fos.close(); } catch (Exception e) { e.printStackTrace(); } } openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data//files目录,如: /data/data/cn.tony.app/files/message.txt, 下面讲解某些特殊文件读写需要注意的地方: 读写sdcard上的文件 其中读写步骤按如下进行: 1、调用Environment的getExternalStorageState()方法判断手机上是否插了sd卡,且应用程序具有读写SD卡的权限,如下代码将返回true Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 2、调用Environment.getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录,或者使用"/mnt/sdcard/"目录 3、使用IO流操作SD卡上的文件 注意点:手机应该已插入SD卡,对于模拟器而言,可通过mksdcard命令来创建虚拟存储卡 必须在AndroidManifest.xml上配置读写SD卡的权限 // 文件写操作函数 private void write(String content) { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 如果sdcard存在 File file = new File(Environment.getExternalStorageDirectory() .toString() + File.separator + DIR + File.separator + FILENAME); // 定义File类对象 if (!file.getParentFile().exists()) { // 父文件夹不存在 file.getParentFile().mkdirs(); // 创建文件夹 } PrintStream out = null; // 打印流对象用于输出 try { out = new PrintStream(new FileOutputStream(file, true)); // 追加文件 out.println(content); } catch (Exception e) { e.printStackTrace(); } finally { if (out != null) { out.close(); // 关闭打印流 } } } else { // SDCard不存在,使用Toast提示用户 Toast.makeText(this, "保存失败,SD卡不存在!", Toast.LENGTH_LONG).show(); } } // 文件读操作函数 private String read() { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 如果sdcard存在 File file = new File(Environment.getExternalStorageDirectory() .toString() + File.separator + DIR + File.separator + FILENAME); // 定义File类对象 if (!file.getParentFile().exists()) { // 父文件夹不存在 file.getParentFile().mkdirs(); // 创建文件夹 } Scanner scan = null; // 扫描输入 StringBuilder sb = new StringBuilder(); try { scan = new Scanner(new FileInputStream(file)); // 实例化Scanner while (scan.hasNext()) { // 循环读取 sb.append(scan.next() + "\n"); // 设置文本 } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } finally { if (scan != null) { scan.close(); // 关闭打印流 } } } else { // SDCard不存在,使用Toast提示用户 Toast.makeText(this, "读取失败,SD卡不存在!", Toast.LENGTH_LONG).show(); } return null; } 复制代码 第三种:SQLite存储数据 SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧 SQLiteDatabase类为我们提供了很多种方法,上面的代码中基本上囊括了大部分的数据库操作;对于添加、更新和删除来说,我们都可以使用 1 db.executeSQL(String sql); 2 db.executeSQL(String sql, Object[] bindArgs);//sql语句中使用占位符,然后第二个参数是实际的参数集 除了统一的形式之外,他们还有各自的操作方法: 1 db.insert(String table, String nullColumnHack, ContentValues values); 2 db.update(String table, Contentvalues values, String whereClause, String whereArgs); 3 db.delete(String table, String whereClause, String whereArgs);以上三个方法的第一个参数都是表示要操作的表名;insert中的第二个参数表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL,不至于出现错误;insert中的第三个参数是ContentValues类型的变量,是键值对组成的Map,key代表列名,value代表该列要插入的值;update的第二个参数也很类似,只不过它是更新该字段key为最新的value值,第三个参数whereClause表示WHERE表达式,比如“age > ? and age < ?”等,最后的whereArgs参数是占位符的实际参数值;delete方法的参数也是一样 下面给出demo 数据的添加 1.使用insert方法 复制代码1 ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据2 cv.put("title","you are beautiful");//添加title3 cv.put("weather","sun"); //添加weather4 cv.put("context","xxxx"); //添加context5 String publish = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")6 .format(new Date());7 cv.put("publish ",publish); //添加publish8 db.insert("diary",null,cv);//执行插入操作复制代码2.使用execSQL方式来实现 String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc');//插入操作的SQL语句db.execSQL(sql);//执行SQL语句数据的删除 同样有2种方式可以实现 String whereClause = "username=?";//删除的条件String[] whereArgs = {"Jack Johnson"};//删除的条件参数db.delete("user",whereClause,whereArgs);//执行删除使用execSQL方式的实现 String sql = "delete from user where username='Jack Johnson'";//删除操作的SQL语句db.execSQL(sql);//执行删除操作数据修改 同上,仍是2种方式 ContentValues cv = new ContentValues();//实例化ContentValuescv.put("password","iHatePopMusic");//添加要更改的字段及内容String whereClause = "username=?";//修改条件String[] whereArgs = {"Jack Johnson"};//修改条件的参数db.update("user",cv,whereClause,whereArgs);//执行修改使用execSQL方式的实现 String sql = "update user set password = 'iHatePopMusic' where username='Jack Johnson'";//修改的SQL语句db.execSQL(sql);//执行修改数据查询 下面来说说查询操作。查询操作相对于上面的几种操作要复杂些,因为我们经常要面对着各种各样的查询条件,所以系统也考虑到这种复杂性,为我们提供了较为丰富的查询形式: 1 db.rawQuery(String sql, String[] selectionArgs); 2 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); 3 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 4 db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 上面几种都是常用的查询方法,第一种最为简单,将所有的SQL语句都组织到一个字符串中,使用占位符代替实际参数,selectionArgs就是占位符实际参数集; 各参数说明: table:表名称colums:表示要查询的列所有名称集selection:表示WHERE之后的条件语句,可以使用占位符selectionArgs:条件语句的参数数组groupBy:指定分组的列名having:指定分组条件,配合groupBy使用orderBy:y指定排序的列名limit:指定分页参数distinct:指定“true”或“false”表示要不要过滤重复值Cursor:返回值,相当于结果集ResultSet最后,他们同时返回一个Cursor对象,代表数据集的游标,有点类似于JavaSE中的ResultSet。下面是Cursor对象的常用方法: 复制代码 1 c.move(int offset); //以当前位置为参考,移动到指定行 2 c.moveToFirst(); //移动到第一行 3 c.moveToLast(); //移动到最后一行 4 c.moveToPosition(int position); //移动到指定行 5 c.moveToPrevious(); //移动到前一行 6 c.moveToNext(); //移动到下一行 7 c.isFirst(); //是否指向第一条 8 c.isLast(); //是否指向最后一条 9 c.isBeforeFirst(); //是否指向第一条之前 10 c.isAfterLast(); //是否指向最后一条之后 11 c.isNull(int columnIndex); //指定列是否为空(列基数为0) 12 c.isClosed(); //游标是否已关闭 13 c.getCount(); //总数据项数 14 c.getPosition(); //返回当前游标所指向的行数 15 c.getColumnIndex(String columnName);//返回某列名对应的列索引值 16 c.getString(int columnIndex); //返回当前行指定列的值 复制代码实现代码 复制代码String[] params = {12345,123456};Cursor cursor = db.query("user",columns,"ID=?",params,null,null,null);//查询并获得游标if(cursor.moveToFirst()){//判断游标是否为空 for(int i=0;i<cursor.getCount();i++){ cursor.move(i);//移动到指定记录 String username = cursor.getString(cursor.getColumnIndex("username"); String password = cursor.getString(cursor.getColumnIndex("password")); } }复制代码通过rawQuery实现的带参数查询 复制代码Cursor result=db.rawQuery("SELECT ID, name, inventory FROM mytable");//Cursor c = db.rawQuery("s name, inventory FROM mytable where ID=?",new Stirng[]{"123456"}); result.moveToFirst(); while (!result.isAfterLast()) { int id=result.getInt(0); String name=result.getString(1); int inventory=result.getInt(2); // do something useful with these result.moveToNext(); } result.close();复制代码 在上面的代码示例中,已经用到了这几个常用方法中的一些,关于更多的信息,大家可以参考官方文档中的说明。 最后当我们完成了对数据库的操作后,记得调用SQLiteDatabase的close()方法释放数据库连接,否则容易出现SQLiteException。 上面就是SQLite的基本应用,但在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。 这里直接使用案例讲解:下面是案例demo的界面 SQLiteOpenHelper类介绍 SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。 方法名 方法描述SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version) 构造方法,其中 context 程序上下文环境 即:XXXActivity.this; name :数据库名字; factory:游标工厂,默认为null,即为使用默认工厂; version 数据库版本号 onCreate(SQLiteDatabase db) 创建数据库时调用onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion) 版本更新时调用getReadableDatabase() 创建或打开一个只读数据库getWritableDatabase() 创建或打开一个读写数据库首先创建数据库类 复制代码 1 import android.content.Context; 2 import android.database.sqlite.SQLiteDatabase; 3 import android.database.sqlite.SQLiteDatabase.CursorFactory; 4 import android.database.sqlite.SQLiteOpenHelper; 5 6 public class SqliteDBHelper extends SQLiteOpenHelper { 7 8 // 步骤1:设置常数参量 9 private static final String DATABASE_NAME = "diary_db";10 private static final int VERSION = 1;11 private static final String TABLE_NAME = "diary";12 13 // 步骤2:重载构造方法14 public SqliteDBHelper(Context context) {15 super(context, DATABASE_NAME, null, VERSION);16 }17 18 /*19 * 参数介绍:context 程序上下文环境 即:XXXActivity.this 20 * name 数据库名字 21 * factory 接收数据,一般情况为null22 * version 数据库版本号23 */24 public SqliteDBHelper(Context context, String name, CursorFactory factory,25 int version) {26 super(context, name, factory, version);27 }28 //数据库第一次被创建时,onCreate()会被调用29 @Override30 public void onCreate(SQLiteDatabase db) {31 // 步骤3:数据库表的创建32 String strSQL = "create table "33 + TABLE_NAME34 + "(tid integer primary key autoincrement,title varchar(20),weather varchar(10),context text,publish date)";35 //步骤4:使用参数db,创建对象36 db.execSQL(strSQL);37 }38 //数据库版本变化时,会调用onUpgrade()39 @Override40 public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {41 42 }43 }复制代码正如上面所述,数据库第一次创建时onCreate方法会被调用,我们可以执行创建表的语句,当系统发现版本变化之后,会调用onUpgrade方法,我们可以执行修改表结构等语句。 我们需要一个Dao,来封装我们所有的业务方法,代码如下: 复制代码 1 import android.content.Context; 2 import android.database.Cursor; 3 import android.database.sqlite.SQLiteDatabase; 4 5 import com.chinasoft.dbhelper.SqliteDBHelper; 6 7 public class DiaryDao { 8 9 private SqliteDBHelper sqliteDBHelper;10 private SQLiteDatabase db;11 12 // 重写构造方法13 public DiaryDao(Context context) {14 this.sqliteDBHelper = new SqliteDBHelper(context);15 db = sqliteDBHelper.getWritableDatabase();16 }17 18 // 读操作19 public String execQuery(final String strSQL) {20 try {21 System.out.println("strSQL>" + strSQL);22 // Cursor相当于JDBC中的ResultSet23 Cursor cursor = db.rawQuery(strSQL, null);24 // 始终让cursor指向数据库表的第1行记录25 cursor.moveToFirst();26 // 定义一个StringBuffer的对象,用于动态拼接字符串27 StringBuffer sb = new StringBuffer();28 // 循环游标,如果不是最后一项记录29 while (!cursor.isAfterLast()) {30 sb.append(cursor.getInt(0) + "/" + cursor.getString(1) + "/"31 + cursor.getString(2) + "/" + cursor.getString(3) + "/"32 + cursor.getString(4)+"#");33 //cursor游标移动34 cursor.moveToNext();35 }36 db.close();37 return sb.deleteCharAt(sb.length()-1).toString();38 } catch (RuntimeException e) {39 e.printStackTrace();40 return null;41 }42 43 }44 45 // 写操作46 public boolean execOther(final String strSQL) {47 db.beginTransaction(); //开始事务48 try {49 System.out.println("strSQL" + strSQL);50 db.execSQL(strSQL);51 db.setTransactionSuccessful(); //设置事务成功完成 52 db.close();53 return true;54 } catch (RuntimeException e) {55 e.printStackTrace();56 return false;57 }finally { 58 db.endTransaction(); //结束事务 59 } 60 61 }62 }复制代码我们在Dao构造方法中实例化sqliteDBHelper并获取一个SQLiteDatabase对象,作为整个应用的数据库实例;在增删改信息时,我们采用了事务处理,确保数据完整性;最后要注意释放数据库资源db.close(),这一个步骤在我们整个应用关闭时执行,这个环节容易被忘记,所以朋友们要注意。 我们获取数据库实例时使用了getWritableDatabase()方法,也许朋友们会有疑问,在getWritableDatabase()和getReadableDatabase()中,你为什么选择前者作为整个应用的数据库实例呢?在这里我想和大家着重分析一下这一点。 我们来看一下SQLiteOpenHelper中的getReadableDatabase()方法: 复制代码 1 public synchronized SQLiteDatabase getReadableDatabase() { 2 if (mDatabase != null && mDatabase.isOpen()) { 3 // 如果发现mDatabase不为空并且已经打开则直接返回 4 return mDatabase; 5 } 6 7 if (mIsInitializing) { 8 // 如果正在初始化则抛出异常 9 throw new IllegalStateException("getReadableDatabase called recursively"); 10 } 11 12 // 开始实例化数据库mDatabase 13 14 try { 15 // 注意这里是调用了getWritableDatabase()方法 16 return getWritableDatabase(); 17 } catch (SQLiteException e) { 18 if (mName == null) 19 throw e; // Can't open a temp database read-only! 20 Log.e(TAG, "Couldn't open " + mName + " for writing (will try read-only):", e); 21 } 22 23 // 如果无法以可读写模式打开数据库 则以只读方式打开 24 25 SQLiteDatabase db = null; 26 try { 27 mIsInitializing = true; 28 String path = mContext.getDatabasePath(mName).getPath();// 获取数据库路径 29 // 以只读方式打开数据库 30 db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY); 31 if (db.getVersion() != mNewVersion) { 32 throw new SQLiteException("Can't upgrade read-only database from version " + db.getVersion() + " to " 33 + mNewVersion + ": " + path); 34 } 35 36 onOpen(db); 37 Log.w(TAG, "Opened " + mName + " in read-only mode"); 38 mDatabase = db;// 为mDatabase指定新打开的数据库 39 return mDatabase;// 返回打开的数据库 40 } finally { 41 mIsInitializing = false; 42 if (db != null && db != mDatabase) 43 db.close(); 44 } 45 }复制代码在getReadableDatabase()方法中,首先判断是否已存在数据库实例并且是打开状态,如果是,则直接返回该实例,否则试图获取一个可读写模式的数据库实例,如果遇到磁盘空间已满等情况获取失败的话,再以只读模式打开数据库,获取数据库实例并返回,然后为mDatabase赋值为最新打开的数据库实例。既然有可能调用到getWritableDatabase()方法,我们就要看一下了: 复制代码public synchronized SQLiteDatabase getWritableDatabase() { if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) { // 如果mDatabase不为空已打开并且不是只读模式 则返回该实例 return mDatabase; } if (mIsInitializing) { throw new IllegalStateException("getWritableDatabase called recursively"); } // If we have a read-only database open, someone could be using it // (though they shouldn't), which would cause a lock to be held on // the file, and our attempts to open the database read-write would // fail waiting for the file lock. To prevent that, we acquire the // lock on the read-only database, which shuts out other users. boolean success = false; SQLiteDatabase db = null; // 如果mDatabase不为空则加锁 阻止其他的操作 if (mDatabase != null) mDatabase.lock(); try { mIsInitializing = true; if (mName == null) { db = SQLiteDatabase.create(null); } else { // 打开或创建数据库 db = mContext.openOrCreateDatabase(mName, 0, mFactory); } // 获取数据库版本(如果刚创建的数据库,版本为0) int version = db.getVersion(); // 比较版本(我们代码中的版本mNewVersion为1) if (version != mNewVersion) { db.beginTransaction();// 开始事务 try { if (version == 0) { // 执行我们的onCreate方法 onCreate(db); } else { // 如果我们应用升级了mNewVersion为2,而原版本为1则执行onUpgrade方法 onUpgrade(db, version, mNewVersion); } db.setVersion(mNewVersion);// 设置最新版本 db.setTransactionSuccessful();// 设置事务成功 } finally { db.endTransaction();// 结束事务 } } onOpen(db); success = true; return db;// 返回可读写模式的数据库实例 } finally { mIsInitializing = false; if (success) { // 打开成功 if (mDatabase != null) { // 如果mDatabase有值则先关闭 try { mDatabase.close(); } catch (Exception e) { } mDatabase.unlock();// 解锁 } mDatabase = db;// 赋值给mDatabase } else { // 打开失败的情况:解锁、关闭 if (mDatabase != null) mDatabase.unlock(); if (db != null) db.close(); } } }复制代码大家可以看到,几个关键步骤是,首先判断mDatabase如果不为空已打开并不是只读模式则直接返回,否则如果mDatabase不为空则加锁,然后开始打开或创建数据库,比较版本,根据版本号来调用相应的方法,为数据库设置新版本号,最后释放旧的不为空的mDatabase并解锁,把新打开的数据库实例赋予mDatabase,并返回最新实例。 看完上面的过程之后,大家或许就清楚了许多,如果不是在遇到磁盘空间已满等情况,getReadableDatabase()一般都会返回和getWritableDatabase()一样的数据库实例,所以我们在DBManager构造方法中使用getWritableDatabase()获取整个应用所使用的数据库实例是可行的。当然如果你真的担心这种情况会发生,那么你可以先用getWritableDatabase()获取数据实例,如果遇到异常,再试图用getReadableDatabase()获取实例,当然这个时候你获取的实例只能读不能写了 最后,让我们看一下如何使用这些数据操作方法来显示数据,界面核心逻辑代码: 复制代码public class SQLiteActivity extends Activity { public DiaryDao diaryDao; //因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory); //所以要确保context已初始化,我们可以把实例化Dao的步骤放在Activity的onCreate里 @Override protected void onCreate(Bundle savedInstanceState) { diaryDao = new DiaryDao(SQLiteActivity.this); initDatabase(); } class ViewOcl implements View.OnClickListener { @Override public void onClick(View v) { String strSQL; boolean flag; String message; switch (v.getId()) { case R.id.btnAdd: String title = txtTitle.getText().toString().trim(); String weather = txtWeather.getText().toString().trim();; String context = txtContext.getText().toString().trim();; String publish = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .format(new Date()); // 动态组件SQL语句 strSQL = "insert into diary values(null,'" + title + "','" + weather + "','" + context + "','" + publish + "')"; flag = diaryDao.execOther(strSQL); //返回信息 message = flag?"添加成功":"添加失败"; Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); break; case R.id.btnDelete: strSQL = "delete from diary where tid = 1"; flag = diaryDao.execOther(strSQL); //返回信息 message = flag?"删除成功":"删除失败"; Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); break; case R.id.btnQuery: strSQL = "select * from diary order by publish desc"; String data = diaryDao.execQuery(strSQL); Toast.makeText(getApplicationContext(), data, Toast.LENGTH_LONG).show(); break; case R.id.btnUpdate: strSQL = "update diary set title = '测试标题1-1' where tid = 1"; flag = diaryDao.execOther(strSQL); //返回信息 message = flag?"更新成功":"更新失败"; Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); break; } } } private void initDatabase() { // 创建数据库对象 SqliteDBHelper sqliteDBHelper = new SqliteDBHelper(SQLiteActivity.this); sqliteDBHelper.getWritableDatabase(); System.out.println("数据库创建成功"); } }复制代码 Android sqlite3数据库管理工具 Android SDK的tools目录下提供了一个sqlite3.exe工具,这是一个简单的sqlite数据库管理工具。开发者可以方便的使用其对sqlite数据库进行命令行的操作。 程序运行生成的.db文件一般位于"/data/data/项目名(包括所处包名)/databases/.db",因此要对数据库文件进行操作需要先找到数据库文件: 1、进入shell 命令 adb shell2、找到数据库文件 cd data/data ls --列出所有项目 cd project_name --进入所需项目名 cd databases ls --列出现寸的数据库文件 3、进入数据库 sqlite3 test_db --进入所需数据库 会出现类似如下字样: SQLite version 3.6.22Enter ".help" for instructionsEnter SQL statements terminated with a ";"sqlite>至此,可对数据库进行sql操作。 4、sqlite常用命令 .databases --产看当前数据库.tables --查看当前数据库中的表.help --sqlite3帮助.schema --各个表的生成语句 原文地址https://www.cnblogs.com/ITtangtang/p/3920916.html
auto_answer 2019-12-02 01:50:21 0 浏览量 回答数 0

回答

使本文介绍使用 Jenkins 构建 SAE 应用的持续集成。 前提条件 在开始持续集成之前,需要完成下述的准备工作。 获取阿里云的 Access Key ID 和 Access Key Secret。 使用已经开通了 SAE 服务的主账号登录阿里云官网。 进入 Access Key 控制台,创建 Access Key ID 和 Access Key Secret。EDAS使用 Jenkins 创建持续集成01 在使用 Jenkins 自动部署应用之前,需要先在 SAE 控制台中创建一个可以部署的应用。 登录 SAE 控制台。 参考应用部署概述,部署应用。 在左侧导航栏中单击应用管理。找到您在上一步中创建的应用并单击进入详情页面,获取应用 ID 的字段内容。在SAE控制平台获取应用ID 使用 GitLab 托管您的代码。您可以自行搭建 Gitlab 或者使用阿里云 Code。 本文使用通过自行搭建的 GitLab 做演示,关于 Gitlab 的更多信息请参考 GitLab。 了解并使用 Jenkins。关于 Jenkins 的更多详细信息请参考 Jenkins 官网。 背景信息 使用 Jenkins 可以构建 SAE 应用的持续集成方案。该方案涉及下面的计算机语言或开发工具,阅读本文需要对下述的语言或工具有一定的理解。 工具 说明 Maven Maven 是一个项目管理和构建的自动化工具。 Jenkins Jenkins是一个可扩展的持续集成引擎。 GitLab GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。 它拥有与 GitHub 类似的功能,能够浏览源代码,管理缺陷和注释。 配置项目 参考通过 toolkit-maven-plugin 插件自动化部署应用修改项目配置,添加 toolkit-maven-plugin 及部署信息。您在修改完项目配置后,建议在本地使用 Maven 构建验证配置是否正确。 安装和配置 Jenkins 进入 Jenkins 官网下载安装 Jenkins。 在 Jenkins 控制台的菜单栏中选择系统管理 > 插件管理,安装 Git 和 GitLab 插件。 安装 GIT Client Plugin 和 GIT Plugin 插件可以帮助 Jenkins 拉取 Git 仓库中的代码。 安装 Gitlab Hook Plugin 插件可以帮助 Jenkins 在收到 Gitlab 发来的 Hook 后触发一次构建。 安装和配置 Jenkins 安装 Maven 构建工具,请参见 Maven 官网。 在 Jenkins 控制台的菜单栏中选择系统管理 > 全局工具配置,选择 Maven 版本名称并配置路径。 Jenkins 控制台设置Maven 在 Jenkins 服务器上生成 SSH RSA 密钥对,并将公匙导入 GitLab,实现 Jenkins 拉取 GitLab 代码时自动认证。 参考 GitLab 文档,在 Jenkins 服务器运行 Jenkins 软件的用户下,生成 SSH RSA 密钥对。 EDAS在 Jenkins 服务器运行 Jenkins 软件的用户下,生成 SSH RSA 密钥对 进入 GitLab 首页,在菜单栏选择Settings > Deploy Keys ,并单击 new deploy key 添加 key,导入在Jenkins服务器上创建的SSH RSA公匙。 EDAS使用Jenkins在gitlab导公钥1EDAS使用Jenkins在gitlab导公钥2 创建 Jenkins 任务。 在 Jenkins 首页左侧导航栏中单击新建,创建 Jenkins 任务,并选择构建一个自由风格的软件项目。 EDAS使用Jenkins集成之创建项目 在 源码管理 页面中选择 Git,并设置相关参数。 Repository URL:您的项目的 Git 协议地址。 Credentials:安全凭证,选择无即可(前提是运行 Jenkins 软件的用户的 SSH RSA 公匙已添加到该 Git 项目所在的 GitLab 中,否则这里会报错)。 EDAS使用Jenkins集成之源码管理 单击构建触发器页签,勾选轮询 SCM。 单击构建环境页签,勾选 Add timestamps to the Console Output(为控制台输出的信息添加时间戳)。 单击构建页签,然后单击增加构建步骤。 在调用顶层 Maven 目标区域设置 Maven 版本和目标。如果您想部署多模块工程,请参见创建多模块工程的 Jenkins 任务。 Maven Version:单击该选项后面的下拉框,选择在全局工具配置里配置的 Maven 版本名称。 Goals:填入 clean package toolkit:deploy (如有其它参数,请根据实际情况填入) EDAS使用Jekins集成之调用顶层 Maven 目标 配置 Gitlab 的 Web Hook,实现自动构建 右键单击 GitLab 工程,然后选择 Setting > Web Hooks。 在 Web Hooks 页面的在 URL 文本框中输入http://jenkins服务器地址:jenkins服务器监听端口/git/notifyCommit?url=本项目的git协议地址 例如:http://123.57.57.164:8080/git/notifyCommit?url=git@code.aliyun.com:tdy218/hello-edas.git 配置 Gitlab 的 Web Hook,实现自动构建 图中表示的 Jenkins 服务器地址为您的 Jenkins 服务器的 Web 访问地址如 http://123.57.57.164:8080。 配置完成后,单击 Test Hook,进行测试。 配置 Gitlab 的 Web Hook结果 配置正确后,提交变更到 GitLab 如果上述步骤配置正确,这次提交会触发一次 GitLab Hook。 Jenkins 在接受到这个 Hook 后会构建您的 Maven 项目,并在构建结束时调用 SAE POP API 脚本触发部署。 提交部署成功输出的日志信息(Build Number > 控制台输出)。 15:58:51 [INFO] Deploy application successfully! 15:58:51 [INFO] ------------------------------------------------------------------------ 15:58:51 [INFO] BUILD SUCCESS 15:58:51 [INFO] ------------------------------------------------------------------------ 15:58:51 [INFO] Total time: 24.330 s 15:58:51 [INFO] Finished at: 2018-12-25T15:58:51+08:00 15:58:51 [INFO] Final Memory: 23M/443M 15:58:51 [INFO] ------------------------------------------------------------------------ 15:58:51 Finished: SUCCESS 如果部署失败,可以登录 SAE 控制台 ,在左侧导航栏中单击应用管理 > 应用列表 ,在应用列表页面单击具体应用名称,进入应用详情页面。在左侧导航栏单击变更记录来查看此次部署任务的执行过程。 创建多模块工程的 Jenkins 任务 创建多模块工程的 Jenkins 任务和安装和配置 Jenkins第 5 步基本相同,只需要调整下调用顶层 Maven 目标。如果工程为多模块工程,想在 Jenkins 中部署子模块的话,那么需要在父模块中调用 mvn clean install 命令,然后在子模块中调用 mvn clean package toolkit:deploy 命令。以 Demo 工程为例,工程结构如下: sh-3.2# tree -L 1 carshop carshop ├── detail ├── itemcenter ├── itemcenter-api └── pom.xml 其中,detail、itemcenter、itemcenter-api 为子模块,现在想部署 itemcenter 模块的话,那么需要在父工程中设置一个 clean install 构建目标,然后在 itemcenter 模块中设置 clean package toolkit:deploy 构建目标。 创建多模块工程的 Jenkins 任务
1934890530796658 2020-03-27 13:10:36 0 浏览量 回答数 0

问题

最佳实践多语言网站?mysql

我已经在这个问题上苦苦挣扎了好几个月了,但是以前我从来没有需要探索所有可能的选择的情况。现在,我觉得该是时候了解各种可能性并创建自己的个人喜好了,以便在我即将进行的项目中使用。 首先让我勾勒出我要...
保持可爱mmm 2020-05-18 09:52:23 2 浏览量 回答数 1

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT